• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
20 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/**
30 * @constructor
31 * @extends {WebInspector.SelectionDialogContentProvider}
32 * @param {!WebInspector.View} view
33 * @param {!WebInspector.UISourceCode} uiSourceCode
34 * @param {function(number, number)} selectItemCallback
35 */
36WebInspector.StyleSheetOutlineDialog = function(view, uiSourceCode, selectItemCallback)
37{
38    WebInspector.SelectionDialogContentProvider.call(this);
39    this._selectItemCallback = selectItemCallback;
40    this._rules = [];
41    this._view = view;
42    this._uiSourceCode = uiSourceCode;
43    this._requestItems();
44}
45
46/**
47 * @param {!WebInspector.View} view
48 * @param {!WebInspector.UISourceCode} uiSourceCode
49 * @param {function(number, number)} selectItemCallback
50 */
51WebInspector.StyleSheetOutlineDialog.show = function(view, uiSourceCode, selectItemCallback)
52{
53    if (WebInspector.Dialog.currentInstance())
54        return null;
55    var delegate = new WebInspector.StyleSheetOutlineDialog(view, uiSourceCode, selectItemCallback);
56    var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(delegate);
57    WebInspector.Dialog.show(view.element, filteredItemSelectionDialog);
58}
59
60WebInspector.StyleSheetOutlineDialog.prototype = {
61    /**
62     * @return {number}
63     */
64    itemCount: function()
65    {
66        return this._rules.length;
67    },
68
69    /**
70     * @param {number} itemIndex
71     * @return {string}
72     */
73    itemKeyAt: function(itemIndex)
74    {
75        return this._rules[itemIndex].selectorText;
76    },
77
78    /**
79     * @param {number} itemIndex
80     * @param {string} query
81     * @return {number}
82     */
83    itemScoreAt: function(itemIndex, query)
84    {
85        var rule = this._rules[itemIndex];
86        return -rule.rawLocation.lineNumber;
87    },
88
89    /**
90     * @param {number} itemIndex
91     * @param {string} query
92     * @param {!Element} titleElement
93     * @param {!Element} subtitleElement
94     */
95    renderItem: function(itemIndex, query, titleElement, subtitleElement)
96    {
97        var rule = this._rules[itemIndex];
98        titleElement.textContent = rule.selectorText;
99        this.highlightRanges(titleElement, query);
100        subtitleElement.textContent = ":" + (rule.rawLocation.lineNumber + 1);
101    },
102
103    _requestItems: function()
104    {
105        /**
106         * @param {?Protocol.Error} error
107         * @param {!Array.<!CSSAgent.CSSStyleSheetHeader>} infos
108         * @this {WebInspector.StyleSheetOutlineDialog}
109         */
110        function didGetAllStyleSheets(error, infos)
111        {
112            if (error)
113                return;
114
115            for (var i = 0; i < infos.length; ++i) {
116                var info = infos[i];
117                if (info.sourceURL === this._uiSourceCode.url) {
118                    WebInspector.CSSStyleSheet.createForId(info.styleSheetId, didGetStyleSheet.bind(this));
119                    return;
120                }
121            }
122        }
123
124        CSSAgent.getAllStyleSheets(didGetAllStyleSheets.bind(this));
125
126        /**
127         * @param {?WebInspector.CSSStyleSheet} styleSheet
128         * @this {WebInspector.StyleSheetOutlineDialog}
129         */
130        function didGetStyleSheet(styleSheet)
131        {
132            if (!styleSheet)
133                return;
134
135            this._rules = styleSheet.rules;
136            this.refresh();
137        }
138    },
139
140    /**
141     * @param {number} itemIndex
142     * @param {string} promptValue
143     */
144    selectItem: function(itemIndex, promptValue)
145    {
146        var rule = this._rules[itemIndex];
147        var lineNumber = rule.rawLocation.lineNumber;
148        if (!isNaN(lineNumber) && lineNumber >= 0)
149            this._selectItemCallback(lineNumber, rule.rawLocation.columnNumber);
150    },
151
152    __proto__: WebInspector.SelectionDialogContentProvider.prototype
153}
154