1197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// found in the LICENSE file.
4197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
5197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @constructor
7197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @extends {WebInspector.View}
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @implements {WebInspector.TargetManager.Observer}
9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
10197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.MediaQueryInspector = function()
11197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
12197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.View.call(this);
13197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this.element.classList.add("media-inspector-view", "media-inspector-view-empty");
14197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this.element.addEventListener("click", this._onMediaQueryClicked.bind(this), false);
15197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this.element.addEventListener("contextmenu", this._onContextMenu.bind(this), false);
167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._mediaThrottler = new WebInspector.Throttler(0);
17197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
18197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._offset = 0;
19197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._scale = 1;
207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._lastReportedCount = 0;
21197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
22197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.targetManager.observeTargets(this);
23197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
24197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.zoomManager.addEventListener(WebInspector.ZoomManager.Events.ZoomChanged, this._renderMediaQueries.bind(this), this);
25197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
26197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
27197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @enum {number}
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
30197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.MediaQueryInspector.Section = {
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Max: 0,
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    MinMax: 1,
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Min: 2
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
36197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.MediaQueryInspector.Events = {
379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    HeightUpdated: "HeightUpdated",
389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    CountUpdated: "CountUpdated"
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
41197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.MediaQueryInspector.prototype = {
42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Target} target
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
45197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    targetAdded: function(target)
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
47197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // FIXME: adapt this to multiple targets.
48197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this._target)
49197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._target = target;
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._scheduleMediaQueriesUpdate, this);
52197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._scheduleMediaQueriesUpdate, this);
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._scheduleMediaQueriesUpdate, this);
54197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged, this._scheduleMediaQueriesUpdate, this);
55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
56197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
58197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Target} target
59197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    targetRemoved: function(target)
61197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
62197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (target !== this._target)
63197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._scheduleMediaQueriesUpdate, this);
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._scheduleMediaQueriesUpdate, this);
66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._scheduleMediaQueriesUpdate, this);
67197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        target.cssModel.removeEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged, this._scheduleMediaQueriesUpdate, this);
68197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
69197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
71197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {number} offset
72197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {number} scale
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setAxisTransform: function(offset, scale)
75197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (this._offset === offset && Math.abs(this._scale - scale) < 1e-8)
77197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._offset = offset;
79197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._scale = scale;
80197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._renderMediaQueries();
81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
82197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
83197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
84197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {boolean} enabled
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
86197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    setEnabled: function(enabled)
87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._enabled = enabled;
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._scheduleMediaQueriesUpdate();
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Event} event
94197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _onMediaQueryClicked: function(event)
96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var mediaQueryMarker = event.target.enclosingNodeOrSelfWithClass("media-inspector-marker");
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!mediaQueryMarker)
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        /**
102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {number} width
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         */
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function setWidth(width)
105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
106197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            WebInspector.overridesSupport.settings.deviceWidth.set(width);
107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            WebInspector.overridesSupport.settings.emulateResolution.set(true);
108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var model = mediaQueryMarker._model;
111197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (model.section() === WebInspector.MediaQueryInspector.Section.Max) {
112197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            setWidth(model.maxWidthExpression().computedLength());
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
114197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (model.section() === WebInspector.MediaQueryInspector.Section.Min) {
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            setWidth(model.minWidthExpression().computedLength());
117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
118197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var currentWidth = WebInspector.overridesSupport.settings.deviceWidth.get();
120197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (currentWidth !== model.minWidthExpression().computedLength())
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            setWidth(model.minWidthExpression().computedLength());
122197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        else
123197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            setWidth(model.maxWidthExpression().computedLength());
124197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Event} event
128197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _onContextMenu: function(event)
130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var mediaQueryMarker = event.target.enclosingNodeOrSelfWithClass("media-inspector-marker");
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!mediaQueryMarker)
133197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var locations = mediaQueryMarker._locations;
1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var uiLocations = new StringMap();
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        for (var i = 0; i < locations.length; ++i) {
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var uiLocation = WebInspector.cssWorkspaceBinding.rawLocationToUILocation(locations[i]);
1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (!uiLocation)
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                continue;
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var descriptor = String.sprintf("%s:%d:%d", uiLocation.uiSourceCode.uri(), uiLocation.lineNumber + 1, uiLocation.columnNumber + 1);
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            uiLocations.set(descriptor, uiLocation);
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var contextMenuItems = uiLocations.keys().sort();
146197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var contextMenu = new WebInspector.ContextMenu(event);
147197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var subMenuItem = contextMenu.appendSubMenuItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Reveal in source code" : "Reveal In Source Code"));
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        for (var i = 0; i < contextMenuItems.length; ++i) {
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var title = contextMenuItems[i];
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            subMenuItem.appendItem(title, this._revealSourceLocation.bind(this, /** @type {!WebInspector.UILocation} */(uiLocations.get(title))));
151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
152197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        contextMenu.show();
153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
154197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
155197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
156197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.UILocation} location
157197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
158197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _revealSourceLocation: function(location)
159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        WebInspector.Revealer.reveal(location);
161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
162197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
163197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _scheduleMediaQueriesUpdate: function()
164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
165197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!this._enabled)
166197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
167197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._mediaThrottler.schedule(this._refetchMediaQueries.bind(this));
168197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
169197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
170197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
171197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.Throttler.FinishCallback} finishCallback
172197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
173197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _refetchMediaQueries: function(finishCallback)
174197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
175197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!this._enabled) {
176197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            finishCallback();
177197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
178197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
179197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
180197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        /**
181197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!Array.<!WebInspector.CSSMedia>} cssMedias
182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @this {!WebInspector.MediaQueryInspector}
183197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         */
184197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function callback(cssMedias)
185197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
186197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._rebuildMediaQueries(cssMedias);
187197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            finishCallback();
188197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
189197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._target.cssModel.getMediaQueries(callback.bind(this));
190197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
191197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
192197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
193197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Array.<!WebInspector.MediaQueryInspector.MediaQueryUIModel>} models
194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {!Array.<!WebInspector.MediaQueryInspector.MediaQueryUIModel>}
195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _squashAdjacentEqual: function(models)
197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
198197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var filtered = [];
199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; i < models.length; ++i) {
200197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var last = filtered.peekLast();
201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!last || !last.equals(models[i]))
202197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                filtered.push(models[i]);
203197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return filtered;
205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
206197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
207197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
208197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!Array.<!WebInspector.CSSMedia>} cssMedias
209197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
210197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _rebuildMediaQueries: function(cssMedias)
211197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
212197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var queryModels = [];
213197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; i < cssMedias.length; ++i) {
214197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var cssMedia = cssMedias[i];
215197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!cssMedia.mediaList)
216197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                continue;
217197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            for (var j = 0; j < cssMedia.mediaList.length; ++j) {
2187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                var mediaQuery = cssMedia.mediaList[j];
2197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                var queryModel = WebInspector.MediaQueryInspector.MediaQueryUIModel.createFromMediaQuery(cssMedia, mediaQuery);
2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                if (queryModel && queryModel.rawLocation())
221197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                    queryModels.push(queryModel);
222197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        queryModels.sort(compareModels);
225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        queryModels = this._squashAdjacentEqual(queryModels);
226197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
227197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var allEqual = this._cachedQueryModels && this._cachedQueryModels.length == queryModels.length;
228197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; allEqual && i < queryModels.length; ++i)
229197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            allEqual = allEqual && this._cachedQueryModels[i].equals(queryModels[i]);
230197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (allEqual)
231197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
232197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._cachedQueryModels = queryModels;
233197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._renderMediaQueries();
234197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
235197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        /**
236197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!WebInspector.MediaQueryInspector.MediaQueryUIModel} model1
237197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @param {!WebInspector.MediaQueryInspector.MediaQueryUIModel} model2
238197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         * @return {number}
239197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch         */
240197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function compareModels(model1, model2)
241197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
242197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return model1.compareTo(model2);
243197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
244197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
245197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
246197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _renderMediaQueries: function()
247197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
248197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!this._cachedQueryModels)
249197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return;
250197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
251197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var markers = [];
252197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var lastMarker = null;
253197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; i < this._cachedQueryModels.length; ++i) {
254197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var model = this._cachedQueryModels[i];
255197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (lastMarker && lastMarker.model.dimensionsEqual(model)) {
2567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                lastMarker.locations.push(model.rawLocation());
2577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                lastMarker.active = lastMarker.active || model.active();
258197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            } else {
259197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                lastMarker = {
2607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    active: model.active(),
261197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                    model: model,
2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    locations: [ model.rawLocation() ]
263197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                };
264197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                markers.push(lastMarker);
265197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
266197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
267197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (markers.length !== this._lastReportedCount) {
2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._lastReportedCount = markers.length;
2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this.dispatchEventToListeners(WebInspector.MediaQueryInspector.Events.CountUpdated, markers.length);
2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!this.isShowing())
2747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return;
2757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var oldChildrenCount = this.element.children.length;
277197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var scrollTop = this.element.scrollTop;
278197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this.element.removeChildren();
2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var container = null;
281197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        for (var i = 0; i < markers.length; ++i) {
2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (!i || markers[i].model.section() !== markers[i - 1].model.section())
2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                container = this.element.createChild("div", "media-inspector-marker-container");
284197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var marker = markers[i];
285197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var bar = this._createElementFromMediaQueryModel(marker.model);
286197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            bar._model = marker.model;
287197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            bar._locations = marker.locations;
2887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            bar.classList.toggle("media-inspector-marker-inactive", !marker.active);
2897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            container.appendChild(bar);
290197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
291197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this.element.scrollTop = scrollTop;
292197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this.element.classList.toggle("media-inspector-view-empty", !this.element.children.length);
2937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (this.element.children.length !== oldChildrenCount)
294197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this.dispatchEventToListeners(WebInspector.MediaQueryInspector.Events.HeightUpdated);
295197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
296197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
297197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
298197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {number}
299197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
300197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _zoomFactor: function()
301197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
302197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return WebInspector.zoomManager.zoomFactor() / this._scale;
303197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
304197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
305197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    wasShown: function()
306197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
307197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._renderMediaQueries();
308197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
309197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
311197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.MediaQueryInspector.MediaQueryUIModel} model
312197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {!Element}
313197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
314197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _createElementFromMediaQueryModel: function(model)
315197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
316197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var zoomFactor = this._zoomFactor();
317197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var minWidthValue = model.minWidthExpression() ? model.minWidthExpression().computedLength() : 0;
318197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
319197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        const styleClassPerSection = [
3207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            "media-inspector-marker-max-width",
3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            "media-inspector-marker-min-max-width",
3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            "media-inspector-marker-min-width"
323197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        ];
3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var markerElement = document.createElementWithClass("div", "media-inspector-marker");
3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var leftPixelValue = minWidthValue ? (minWidthValue - this._offset) / zoomFactor : 0;
326197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        markerElement.style.left = leftPixelValue + "px";
3277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        markerElement.classList.add(styleClassPerSection[model.section()]);
328197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var widthPixelValue = null;
329197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (model.maxWidthExpression() && model.minWidthExpression())
330197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            widthPixelValue = (model.maxWidthExpression().computedLength() - minWidthValue) / zoomFactor;
331197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        else if (model.maxWidthExpression())
3327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            widthPixelValue = (model.maxWidthExpression().computedLength() - this._offset) / zoomFactor;
333197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        else
334197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            markerElement.style.right = "0";
335197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (typeof widthPixelValue === "number")
336197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            markerElement.style.width = widthPixelValue + "px";
337197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (model.minWidthExpression()) {
3397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var labelClass = model.section() === WebInspector.MediaQueryInspector.Section.MinMax ? "media-inspector-label-right" : "media-inspector-label-left";
3407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var labelContainer = markerElement.createChild("div", "media-inspector-marker-label-container media-inspector-marker-label-container-left");
3417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            labelContainer.createChild("span", "media-inspector-marker-label " + labelClass).textContent = model.minWidthExpression().value() + model.minWidthExpression().unit();
342197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
343197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (model.maxWidthExpression()) {
3457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var labelClass = model.section() === WebInspector.MediaQueryInspector.Section.MinMax ? "media-inspector-label-left" : "media-inspector-label-right";
3467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var labelContainer = markerElement.createChild("div", "media-inspector-marker-label-container media-inspector-marker-label-container-right");
3477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            labelContainer.createChild("span", "media-inspector-marker-label " + labelClass).textContent = model.maxWidthExpression().value() + model.maxWidthExpression().unit();
348197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        markerElement.title = model.mediaText();
350197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return markerElement;
352197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
353197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
354197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    __proto__: WebInspector.View.prototype
355197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch};
356197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
357197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
358197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @constructor
359197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!WebInspector.CSSMedia} cssMedia
360197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {?WebInspector.CSSMediaQueryExpression} minWidthExpression
361197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {?WebInspector.CSSMediaQueryExpression} maxWidthExpression
3627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {boolean} active
363197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
3647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.MediaQueryInspector.MediaQueryUIModel = function(cssMedia, minWidthExpression, maxWidthExpression, active)
365197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
366197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._cssMedia = cssMedia;
367197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._minWidthExpression = minWidthExpression;
368197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._maxWidthExpression = maxWidthExpression;
3697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._active = active;
370197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (maxWidthExpression && !minWidthExpression)
371197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._section = WebInspector.MediaQueryInspector.Section.Max;
372197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    else if (minWidthExpression && maxWidthExpression)
373197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._section = WebInspector.MediaQueryInspector.Section.MinMax;
374197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    else
375197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._section = WebInspector.MediaQueryInspector.Section.Min;
376197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
377197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
378197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
379197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!WebInspector.CSSMedia} cssMedia
3807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!WebInspector.CSSMediaQuery} mediaQuery
381197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @return {?WebInspector.MediaQueryInspector.MediaQueryUIModel}
382197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
3837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.MediaQueryInspector.MediaQueryUIModel.createFromMediaQuery = function(cssMedia, mediaQuery)
384197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
385197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var maxWidthExpression = null;
386197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var maxWidthPixels = Number.MAX_VALUE;
387197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var minWidthExpression = null;
388197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var minWidthPixels = Number.MIN_VALUE;
3897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    var expressions = mediaQuery.expressions();
3907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (var i = 0; i < expressions.length; ++i) {
3917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var expression = expressions[i];
392197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var feature = expression.feature();
393197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (feature.indexOf("width") === -1)
394197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            continue;
395197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var pixels = expression.computedLength();
396197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (feature.startsWith("max-") && pixels < maxWidthPixels) {
397197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            maxWidthExpression = expression;
398197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            maxWidthPixels = pixels;
399197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        } else if (feature.startsWith("min-") && pixels > minWidthPixels) {
400197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            minWidthExpression = expression;
401197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            minWidthPixels = pixels;
402197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
403197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
404197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (minWidthPixels > maxWidthPixels || (!maxWidthExpression && !minWidthExpression))
405197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return null;
406197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
4077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return new WebInspector.MediaQueryInspector.MediaQueryUIModel(cssMedia, minWidthExpression, maxWidthExpression, mediaQuery.active());
408197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
409197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
410197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.MediaQueryInspector.MediaQueryUIModel.prototype = {
411197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
412197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.MediaQueryInspector.MediaQueryUIModel} other
413197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {boolean}
414197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
415197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    equals: function(other)
416197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
417197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this.compareTo(other) === 0;
418197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
419197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
420197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
421197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.MediaQueryInspector.MediaQueryUIModel} other
422197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {boolean}
423197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
424197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    dimensionsEqual: function(other)
425197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
426197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this.section() === other.section()
427197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            && (!this.minWidthExpression() || (this.minWidthExpression().computedLength() === other.minWidthExpression().computedLength()))
428197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            && (!this.maxWidthExpression() || (this.maxWidthExpression().computedLength() === other.maxWidthExpression().computedLength()));
429197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
430197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
431197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
432197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.MediaQueryInspector.MediaQueryUIModel} other
433197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {number}
434197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
435197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    compareTo: function(other)
436197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
437197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this.section() !== other.section())
438197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return this.section() - other.section();
439197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this.dimensionsEqual(other)) {
4407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var myLocation = this.rawLocation();
4417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var otherLocation = other.rawLocation();
442197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!myLocation && !otherLocation)
443197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                return this.mediaText().compareTo(other.mediaText());
444197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (myLocation && !otherLocation)
445197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                return 1;
446197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!myLocation && otherLocation)
447197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                return -1;
4487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (this.active() !== other.active())
4497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                return this.active() ? -1 : 1;
4507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return myLocation.url.compareTo(otherLocation.url) || myLocation.lineNumber - otherLocation.lineNumber || myLocation.columnNumber - otherLocation.columnNumber;
451197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
452197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this.section() === WebInspector.MediaQueryInspector.Section.Max)
4537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return other.maxWidthExpression().computedLength() - this.maxWidthExpression().computedLength();
454197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (this.section() === WebInspector.MediaQueryInspector.Section.Min)
455197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return this.minWidthExpression().computedLength() - other.minWidthExpression().computedLength();
4567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this.minWidthExpression().computedLength() - other.minWidthExpression().computedLength() || other.maxWidthExpression().computedLength() - this.maxWidthExpression().computedLength();
457197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
458197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
459197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
460197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {!WebInspector.MediaQueryInspector.Section}
461197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
462197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    section: function()
463197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
464197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this._section;
465197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
466197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
467197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
468197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {string}
469197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
470197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    mediaText: function()
471197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
472197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this._cssMedia.text;
473197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
474197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
475197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
4767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {?WebInspector.CSSLocation}
477197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
4787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    rawLocation: function()
479197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
4807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!this._rawLocation)
4817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._rawLocation = this._cssMedia.rawLocation();
4827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this._rawLocation;
483197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
484197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
485197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
486197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {?WebInspector.CSSMediaQueryExpression}
487197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
488197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    minWidthExpression: function()
489197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
490197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this._minWidthExpression;
491197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
492197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
493197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
494197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {?WebInspector.CSSMediaQueryExpression}
495197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
496197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    maxWidthExpression: function()
497197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
498197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this._maxWidthExpression;
4997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    },
5007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
5017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
5027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {boolean}
5037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
5047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    active: function()
5057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
5067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this._active;
507197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
508197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
509