1d0825bca7fe65beaee391d30da42e937db621564Steve Block/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2011 Google Inc. All rights reserved.
3d0825bca7fe65beaee391d30da42e937db621564Steve Block *
4d0825bca7fe65beaee391d30da42e937db621564Steve Block * Redistribution and use in source and binary forms, with or without
5d0825bca7fe65beaee391d30da42e937db621564Steve Block * modification, are permitted provided that the following conditions are
6d0825bca7fe65beaee391d30da42e937db621564Steve Block * met:
7d0825bca7fe65beaee391d30da42e937db621564Steve Block *
8d0825bca7fe65beaee391d30da42e937db621564Steve Block *     * Redistributions of source code must retain the above copyright
9d0825bca7fe65beaee391d30da42e937db621564Steve Block * notice, this list of conditions and the following disclaimer.
10d0825bca7fe65beaee391d30da42e937db621564Steve Block *     * Redistributions in binary form must reproduce the above
11d0825bca7fe65beaee391d30da42e937db621564Steve Block * copyright notice, this list of conditions and the following disclaimer
12d0825bca7fe65beaee391d30da42e937db621564Steve Block * in the documentation and/or other materials provided with the
13d0825bca7fe65beaee391d30da42e937db621564Steve Block * distribution.
14d0825bca7fe65beaee391d30da42e937db621564Steve Block *     * Neither the name of Google Inc. nor the names of its
15d0825bca7fe65beaee391d30da42e937db621564Steve Block * contributors may be used to endorse or promote products derived from
16d0825bca7fe65beaee391d30da42e937db621564Steve Block * this software without specific prior written permission.
17d0825bca7fe65beaee391d30da42e937db621564Steve Block *
18d0825bca7fe65beaee391d30da42e937db621564Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19d0825bca7fe65beaee391d30da42e937db621564Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21d0825bca7fe65beaee391d30da42e937db621564Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22d0825bca7fe65beaee391d30da42e937db621564Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23d0825bca7fe65beaee391d30da42e937db621564Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25d0825bca7fe65beaee391d30da42e937db621564Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26d0825bca7fe65beaee391d30da42e937db621564Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27d0825bca7fe65beaee391d30da42e937db621564Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29d0825bca7fe65beaee391d30da42e937db621564Steve Block */
30d0825bca7fe65beaee391d30da42e937db621564Steve Block
31d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditsPanel = function()
32d0825bca7fe65beaee391d30da42e937db621564Steve Block{
33e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WebInspector.Panel.call(this, "audits");
34d0825bca7fe65beaee391d30da42e937db621564Steve Block
35d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.createSidebar();
36d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.auditsTreeElement = new WebInspector.SidebarSectionTreeElement("", {}, true);
37d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.sidebarTree.appendChild(this.auditsTreeElement);
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    this.auditsTreeElement.listItemElement.addStyleClass("hidden");
39d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.auditsTreeElement.expand();
40d0825bca7fe65beaee391d30da42e937db621564Steve Block
41d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.auditsItemTreeElement = new WebInspector.AuditsSidebarTreeElement();
42d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.auditsTreeElement.appendChild(this.auditsItemTreeElement);
43d0825bca7fe65beaee391d30da42e937db621564Steve Block
44d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.auditResultsTreeElement = new WebInspector.SidebarSectionTreeElement(WebInspector.UIString("RESULTS"), {}, true);
45d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.sidebarTree.appendChild(this.auditResultsTreeElement);
46d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.auditResultsTreeElement.expand();
47d0825bca7fe65beaee391d30da42e937db621564Steve Block
485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    this.clearResultsButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear audit results."), "clear-status-bar-item");
49d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.clearResultsButton.addEventListener("click", this._clearButtonClicked.bind(this), false);
50d0825bca7fe65beaee391d30da42e937db621564Steve Block
51d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.viewsContainerElement = document.createElement("div");
52d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.viewsContainerElement.id = "audit-views";
53d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.element.appendChild(this.viewsContainerElement);
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
555ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    this._constructCategories();
565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    this._launcherView = new WebInspector.AuditLauncherView(this.initiateAudit.bind(this));
585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    for (id in this.categoriesById)
595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        this._launcherView.addCategory(this.categoriesById[id]);
60d0825bca7fe65beaee391d30da42e937db621564Steve Block}
61d0825bca7fe65beaee391d30da42e937db621564Steve Block
62d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditsPanel.prototype = {
63d0825bca7fe65beaee391d30da42e937db621564Steve Block    get toolbarItemLabel()
64d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
65d0825bca7fe65beaee391d30da42e937db621564Steve Block        return WebInspector.UIString("Audits");
66d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
67d0825bca7fe65beaee391d30da42e937db621564Steve Block
68d0825bca7fe65beaee391d30da42e937db621564Steve Block    get statusBarItems()
69d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
70d0825bca7fe65beaee391d30da42e937db621564Steve Block        return [this.clearResultsButton.element];
71d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
72d0825bca7fe65beaee391d30da42e937db621564Steve Block
73d0825bca7fe65beaee391d30da42e937db621564Steve Block    get mainResourceLoadTime()
74d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
75d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._mainResourceLoadTime;
76d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
77d0825bca7fe65beaee391d30da42e937db621564Steve Block
78d0825bca7fe65beaee391d30da42e937db621564Steve Block    set mainResourceLoadTime(x)
79d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
80d0825bca7fe65beaee391d30da42e937db621564Steve Block        this._mainResourceLoadTime = x;
81d0825bca7fe65beaee391d30da42e937db621564Steve Block        this._didMainResourceLoad();
82d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
83d0825bca7fe65beaee391d30da42e937db621564Steve Block
84d0825bca7fe65beaee391d30da42e937db621564Steve Block    get mainResourceDOMContentTime()
85d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
86d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._mainResourceDOMContentTime;
87d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
88d0825bca7fe65beaee391d30da42e937db621564Steve Block
89d0825bca7fe65beaee391d30da42e937db621564Steve Block    set mainResourceDOMContentTime(x)
90d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
91d0825bca7fe65beaee391d30da42e937db621564Steve Block        this._mainResourceDOMContentTime = x;
92d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
93d0825bca7fe65beaee391d30da42e937db621564Steve Block
94d0825bca7fe65beaee391d30da42e937db621564Steve Block    get categoriesById()
95d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
96d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._auditCategoriesById;
97d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
98d0825bca7fe65beaee391d30da42e937db621564Steve Block
995ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    addCategory: function(category)
1005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    {
1015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        this.categoriesById[category.id] = category;
1025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        this._launcherView.addCategory(category);
1035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    },
1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
1055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    getCategory: function(id)
1065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    {
1075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return this.categoriesById[id];
1085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    },
1095ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
110d0825bca7fe65beaee391d30da42e937db621564Steve Block    _constructCategories: function()
111d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
112d0825bca7fe65beaee391d30da42e937db621564Steve Block        this._auditCategoriesById = {};
113d0825bca7fe65beaee391d30da42e937db621564Steve Block        for (var categoryCtorID in WebInspector.AuditCategories) {
114d0825bca7fe65beaee391d30da42e937db621564Steve Block            var auditCategory = new WebInspector.AuditCategories[categoryCtorID]();
1158a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            auditCategory._id = categoryCtorID;
1168a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            this.categoriesById[categoryCtorID] = auditCategory;
117d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
118d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
119d0825bca7fe65beaee391d30da42e937db621564Steve Block
120d0825bca7fe65beaee391d30da42e937db621564Steve Block    _executeAudit: function(categories, resultCallback)
121d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        var resources = WebInspector.networkResources;
123d0825bca7fe65beaee391d30da42e937db621564Steve Block
124d0825bca7fe65beaee391d30da42e937db621564Steve Block        var rulesRemaining = 0;
125d0825bca7fe65beaee391d30da42e937db621564Steve Block        for (var i = 0; i < categories.length; ++i)
126d0825bca7fe65beaee391d30da42e937db621564Steve Block            rulesRemaining += categories[i].ruleCount;
127d0825bca7fe65beaee391d30da42e937db621564Steve Block
128d0825bca7fe65beaee391d30da42e937db621564Steve Block        var results = [];
129d0825bca7fe65beaee391d30da42e937db621564Steve Block        var mainResourceURL = WebInspector.mainResource.url;
130d0825bca7fe65beaee391d30da42e937db621564Steve Block
131d0825bca7fe65beaee391d30da42e937db621564Steve Block        function ruleResultReadyCallback(categoryResult, ruleResult)
132d0825bca7fe65beaee391d30da42e937db621564Steve Block        {
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (ruleResult && ruleResult.children)
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                categoryResult.addRuleResult(ruleResult);
135d0825bca7fe65beaee391d30da42e937db621564Steve Block
136d0825bca7fe65beaee391d30da42e937db621564Steve Block            --rulesRemaining;
137d0825bca7fe65beaee391d30da42e937db621564Steve Block
138d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (!rulesRemaining && resultCallback)
139d0825bca7fe65beaee391d30da42e937db621564Steve Block                resultCallback(mainResourceURL, results);
140d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
141d0825bca7fe65beaee391d30da42e937db621564Steve Block
142d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (!rulesRemaining) {
143d0825bca7fe65beaee391d30da42e937db621564Steve Block            resultCallback(mainResourceURL, results);
144d0825bca7fe65beaee391d30da42e937db621564Steve Block            return;
145d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
146d0825bca7fe65beaee391d30da42e937db621564Steve Block
147d0825bca7fe65beaee391d30da42e937db621564Steve Block        for (var i = 0; i < categories.length; ++i) {
148d0825bca7fe65beaee391d30da42e937db621564Steve Block            var category = categories[i];
149d0825bca7fe65beaee391d30da42e937db621564Steve Block            var result = new WebInspector.AuditCategoryResult(category);
150d0825bca7fe65beaee391d30da42e937db621564Steve Block            results.push(result);
1515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            category.run(resources, ruleResultReadyCallback.bind(null, result));
152d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
153d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
154d0825bca7fe65beaee391d30da42e937db621564Steve Block
155d0825bca7fe65beaee391d30da42e937db621564Steve Block    _auditFinishedCallback: function(launcherCallback, mainResourceURL, results)
156d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
157d0825bca7fe65beaee391d30da42e937db621564Steve Block        var children = this.auditResultsTreeElement.children;
158d0825bca7fe65beaee391d30da42e937db621564Steve Block        var ordinal = 1;
159d0825bca7fe65beaee391d30da42e937db621564Steve Block        for (var i = 0; i < children.length; ++i) {
160d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (children[i].mainResourceURL === mainResourceURL)
161d0825bca7fe65beaee391d30da42e937db621564Steve Block                ordinal++;
162d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
163d0825bca7fe65beaee391d30da42e937db621564Steve Block
164d0825bca7fe65beaee391d30da42e937db621564Steve Block        var resultTreeElement = new WebInspector.AuditResultSidebarTreeElement(results, mainResourceURL, ordinal);
165d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.auditResultsTreeElement.appendChild(resultTreeElement);
166d0825bca7fe65beaee391d30da42e937db621564Steve Block        resultTreeElement.reveal();
167d0825bca7fe65beaee391d30da42e937db621564Steve Block        resultTreeElement.select();
168d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (launcherCallback)
169d0825bca7fe65beaee391d30da42e937db621564Steve Block            launcherCallback();
170d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
171d0825bca7fe65beaee391d30da42e937db621564Steve Block
172d0825bca7fe65beaee391d30da42e937db621564Steve Block    initiateAudit: function(categoryIds, runImmediately, launcherCallback)
173d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
174d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (!categoryIds || !categoryIds.length)
175d0825bca7fe65beaee391d30da42e937db621564Steve Block            return;
176d0825bca7fe65beaee391d30da42e937db621564Steve Block
177d0825bca7fe65beaee391d30da42e937db621564Steve Block        var categories = [];
178d0825bca7fe65beaee391d30da42e937db621564Steve Block        for (var i = 0; i < categoryIds.length; ++i)
179d0825bca7fe65beaee391d30da42e937db621564Steve Block            categories.push(this.categoriesById[categoryIds[i]]);
180d0825bca7fe65beaee391d30da42e937db621564Steve Block
181d0825bca7fe65beaee391d30da42e937db621564Steve Block        function initiateAuditCallback(categories, launcherCallback)
182d0825bca7fe65beaee391d30da42e937db621564Steve Block        {
183d0825bca7fe65beaee391d30da42e937db621564Steve Block            this._executeAudit(categories, this._auditFinishedCallback.bind(this, launcherCallback));
184d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
185d0825bca7fe65beaee391d30da42e937db621564Steve Block
186d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (runImmediately)
187d0825bca7fe65beaee391d30da42e937db621564Steve Block            initiateAuditCallback.call(this, categories, launcherCallback);
188d0825bca7fe65beaee391d30da42e937db621564Steve Block        else
189d0825bca7fe65beaee391d30da42e937db621564Steve Block            this._reloadResources(initiateAuditCallback.bind(this, categories, launcherCallback));
190d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
191d0825bca7fe65beaee391d30da42e937db621564Steve Block
192d0825bca7fe65beaee391d30da42e937db621564Steve Block    _reloadResources: function(callback)
193d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
19428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        this._pageReloadCallback = callback;
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block        PageAgent.reloadPage(false);
196d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
197d0825bca7fe65beaee391d30da42e937db621564Steve Block
198d0825bca7fe65beaee391d30da42e937db621564Steve Block    _didMainResourceLoad: function()
199d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
20028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        if (this._pageReloadCallback) {
20128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            var callback = this._pageReloadCallback;
20228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            delete this._pageReloadCallback;
203d0825bca7fe65beaee391d30da42e937db621564Steve Block            callback();
204d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
205d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
206d0825bca7fe65beaee391d30da42e937db621564Steve Block
207d0825bca7fe65beaee391d30da42e937db621564Steve Block    showResults: function(categoryResults)
208d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
209d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (!categoryResults._resultView)
210d0825bca7fe65beaee391d30da42e937db621564Steve Block            categoryResults._resultView = new WebInspector.AuditResultView(categoryResults);
211d0825bca7fe65beaee391d30da42e937db621564Steve Block
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        this.visibleView = categoryResults._resultView;
213d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
214d0825bca7fe65beaee391d30da42e937db621564Steve Block
215d0825bca7fe65beaee391d30da42e937db621564Steve Block    showLauncherView: function()
216d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        this.visibleView = this._launcherView;
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    },
2195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    get visibleView()
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return this._visibleView;
223d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
224d0825bca7fe65beaee391d30da42e937db621564Steve Block
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    set visibleView(x)
226d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (this._visibleView === x)
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return;
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (this._visibleView)
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this._visibleView.hide();
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        this._visibleView = x;
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (x)
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            x.show(this.viewsContainerElement);
237d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
238d0825bca7fe65beaee391d30da42e937db621564Steve Block
239d0825bca7fe65beaee391d30da42e937db621564Steve Block    attach: function()
240d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
241d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebInspector.Panel.prototype.attach.call(this);
242d0825bca7fe65beaee391d30da42e937db621564Steve Block
243d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.auditsItemTreeElement.select();
244d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
245d0825bca7fe65beaee391d30da42e937db621564Steve Block
246d0825bca7fe65beaee391d30da42e937db621564Steve Block    updateMainViewWidth: function(width)
247d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
248d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.viewsContainerElement.style.left = width + "px";
249d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
250d0825bca7fe65beaee391d30da42e937db621564Steve Block
251d0825bca7fe65beaee391d30da42e937db621564Steve Block    _clearButtonClicked: function()
252d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
253d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.auditsItemTreeElement.reveal();
254d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.auditsItemTreeElement.select();
255d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.auditResultsTreeElement.removeChildren();
256d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
257d0825bca7fe65beaee391d30da42e937db621564Steve Block}
258d0825bca7fe65beaee391d30da42e937db621564Steve Block
259d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditsPanel.prototype.__proto__ = WebInspector.Panel.prototype;
260d0825bca7fe65beaee391d30da42e937db621564Steve Block
261d0825bca7fe65beaee391d30da42e937db621564Steve Block
262d0825bca7fe65beaee391d30da42e937db621564Steve Block
2638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockWebInspector.AuditCategory = function(displayName)
264d0825bca7fe65beaee391d30da42e937db621564Steve Block{
265d0825bca7fe65beaee391d30da42e937db621564Steve Block    this._displayName = displayName;
266d0825bca7fe65beaee391d30da42e937db621564Steve Block    this._rules = [];
267d0825bca7fe65beaee391d30da42e937db621564Steve Block}
268d0825bca7fe65beaee391d30da42e937db621564Steve Block
269d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditCategory.prototype = {
270d0825bca7fe65beaee391d30da42e937db621564Steve Block    get id()
271d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
2728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        // this._id value is injected at construction time.
273d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._id;
274d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
275d0825bca7fe65beaee391d30da42e937db621564Steve Block
276d0825bca7fe65beaee391d30da42e937db621564Steve Block    get displayName()
277d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
278d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._displayName;
279d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
280d0825bca7fe65beaee391d30da42e937db621564Steve Block
281d0825bca7fe65beaee391d30da42e937db621564Steve Block    get ruleCount()
282d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
2838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this._ensureInitialized();
284d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._rules.length;
285d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
286d0825bca7fe65beaee391d30da42e937db621564Steve Block
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    addRule: function(rule, severity)
288d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        rule.severity = severity;
290d0825bca7fe65beaee391d30da42e937db621564Steve Block        this._rules.push(rule);
291d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
292d0825bca7fe65beaee391d30da42e937db621564Steve Block
2935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    run: function(resources, callback)
294d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
2958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        this._ensureInitialized();
296d0825bca7fe65beaee391d30da42e937db621564Steve Block        for (var i = 0; i < this._rules.length; ++i)
297d0825bca7fe65beaee391d30da42e937db621564Steve Block            this._rules[i].run(resources, callback);
2988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    },
2998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
3008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    _ensureInitialized: function()
3018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    {
3028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        if (!this._initialized) {
3038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if ("initialize" in this)
3048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                this.initialize();
3058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            this._initialized = true;
3068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        }
307d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
308d0825bca7fe65beaee391d30da42e937db621564Steve Block}
309d0825bca7fe65beaee391d30da42e937db621564Steve Block
310d0825bca7fe65beaee391d30da42e937db621564Steve Block
311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebInspector.AuditRule = function(id, displayName)
312d0825bca7fe65beaee391d30da42e937db621564Steve Block{
313d0825bca7fe65beaee391d30da42e937db621564Steve Block    this._id = id;
314d0825bca7fe65beaee391d30da42e937db621564Steve Block    this._displayName = displayName;
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebInspector.AuditRule.Severity = {
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Info: "info",
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Warning: "warning",
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Severe: "severe"
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebInspector.AuditRule.SeverityOrder = {
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "info": 3,
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "warning": 2,
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    "severe": 1
327d0825bca7fe65beaee391d30da42e937db621564Steve Block}
328d0825bca7fe65beaee391d30da42e937db621564Steve Block
329d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditRule.prototype = {
330d0825bca7fe65beaee391d30da42e937db621564Steve Block    get id()
331d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
332d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._id;
333d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
334d0825bca7fe65beaee391d30da42e937db621564Steve Block
335d0825bca7fe65beaee391d30da42e937db621564Steve Block    get displayName()
336d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
337d0825bca7fe65beaee391d30da42e937db621564Steve Block        return this._displayName;
338d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
339d0825bca7fe65beaee391d30da42e937db621564Steve Block
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    set severity(severity)
341d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        this._severity = severity;
343d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
344d0825bca7fe65beaee391d30da42e937db621564Steve Block
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    run: function(resources, callback)
346d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        var result = new WebInspector.AuditRuleResult(this.displayName);
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        result.severity = this._severity;
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        this.doRun(resources, result, callback);
350d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
351d0825bca7fe65beaee391d30da42e937db621564Steve Block
352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    doRun: function(resources, result, callback)
353d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        throw new Error("doRun() not implemented");
355d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
356d0825bca7fe65beaee391d30da42e937db621564Steve Block}
357d0825bca7fe65beaee391d30da42e937db621564Steve Block
358d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditCategoryResult = function(category)
359d0825bca7fe65beaee391d30da42e937db621564Steve Block{
360d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.title = category.displayName;
361dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    this.ruleResults = [];
362d0825bca7fe65beaee391d30da42e937db621564Steve Block}
363d0825bca7fe65beaee391d30da42e937db621564Steve Block
364d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditCategoryResult.prototype = {
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    addRuleResult: function(ruleResult)
366d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        this.ruleResults.push(ruleResult);
368d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
369d0825bca7fe65beaee391d30da42e937db621564Steve Block}
370d0825bca7fe65beaee391d30da42e937db621564Steve Block
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebInspector.AuditRuleResult = function(value, expanded, className)
372d0825bca7fe65beaee391d30da42e937db621564Steve Block{
373d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.value = value;
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    this.className = className;
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    this.expanded = expanded;
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    this.violationCount = 0;
377d0825bca7fe65beaee391d30da42e937db621564Steve Block}
378d0825bca7fe65beaee391d30da42e937db621564Steve Block
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebInspector.AuditRuleResult.linkifyDisplayName = function(url)
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return WebInspector.linkifyURL(url, WebInspector.displayNameForURL(url));
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
3838a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebInspector.AuditRuleResult.resourceDomain = function(domain)
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return domain || WebInspector.UIString("[empty domain]");
387d0825bca7fe65beaee391d30da42e937db621564Steve Block}
388d0825bca7fe65beaee391d30da42e937db621564Steve Block
389d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditRuleResult.prototype = {
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    addChild: function(value, expanded, className)
391d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
392d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (!this.children)
393d0825bca7fe65beaee391d30da42e937db621564Steve Block            this.children = [];
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        var entry = new WebInspector.AuditRuleResult(value, expanded, className);
395d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.children.push(entry);
396d0825bca7fe65beaee391d30da42e937db621564Steve Block        return entry;
397d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
398d0825bca7fe65beaee391d30da42e937db621564Steve Block
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    addURL: function(url)
400d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return this.addChild(WebInspector.AuditRuleResult.linkifyDisplayName(url));
402d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
403d0825bca7fe65beaee391d30da42e937db621564Steve Block
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    addURLs: function(urls)
405d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        for (var i = 0; i < urls.length; ++i)
407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            this.addURL(urls[i]);
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    },
409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    addSnippet: function(snippet)
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return this.addChild(snippet, false, "source-code");
413d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
414d0825bca7fe65beaee391d30da42e937db621564Steve Block}
415d0825bca7fe65beaee391d30da42e937db621564Steve Block
416d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditsSidebarTreeElement = function()
417d0825bca7fe65beaee391d30da42e937db621564Steve Block{
418d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.small = false;
419d0825bca7fe65beaee391d30da42e937db621564Steve Block
420d0825bca7fe65beaee391d30da42e937db621564Steve Block    WebInspector.SidebarTreeElement.call(this, "audits-sidebar-tree-item", WebInspector.UIString("Audits"), "", null, false);
421d0825bca7fe65beaee391d30da42e937db621564Steve Block}
422d0825bca7fe65beaee391d30da42e937db621564Steve Block
423d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditsSidebarTreeElement.prototype = {
424d0825bca7fe65beaee391d30da42e937db621564Steve Block    onattach: function()
425d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
426d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebInspector.SidebarTreeElement.prototype.onattach.call(this);
427d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
428d0825bca7fe65beaee391d30da42e937db621564Steve Block
429d0825bca7fe65beaee391d30da42e937db621564Steve Block    onselect: function()
430d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
431d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebInspector.panels.audits.showLauncherView();
432d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
433d0825bca7fe65beaee391d30da42e937db621564Steve Block
434d0825bca7fe65beaee391d30da42e937db621564Steve Block    get selectable()
435d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
436d0825bca7fe65beaee391d30da42e937db621564Steve Block        return true;
437d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
438d0825bca7fe65beaee391d30da42e937db621564Steve Block
439d0825bca7fe65beaee391d30da42e937db621564Steve Block    refresh: function()
440d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
441d0825bca7fe65beaee391d30da42e937db621564Steve Block        this.refreshTitles();
442d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
443d0825bca7fe65beaee391d30da42e937db621564Steve Block}
444d0825bca7fe65beaee391d30da42e937db621564Steve Block
445d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditsSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
446d0825bca7fe65beaee391d30da42e937db621564Steve Block
447d0825bca7fe65beaee391d30da42e937db621564Steve Block
448d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditResultSidebarTreeElement = function(results, mainResourceURL, ordinal)
449d0825bca7fe65beaee391d30da42e937db621564Steve Block{
450d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.results = results;
451d0825bca7fe65beaee391d30da42e937db621564Steve Block    this.mainResourceURL = mainResourceURL;
452d0825bca7fe65beaee391d30da42e937db621564Steve Block
453d0825bca7fe65beaee391d30da42e937db621564Steve Block    WebInspector.SidebarTreeElement.call(this, "audit-result-sidebar-tree-item", String.sprintf("%s (%d)", mainResourceURL, ordinal), "", {}, false);
454d0825bca7fe65beaee391d30da42e937db621564Steve Block}
455d0825bca7fe65beaee391d30da42e937db621564Steve Block
456d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditResultSidebarTreeElement.prototype = {
457d0825bca7fe65beaee391d30da42e937db621564Steve Block    onselect: function()
458d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
459d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebInspector.panels.audits.showResults(this.results);
460d0825bca7fe65beaee391d30da42e937db621564Steve Block    },
461d0825bca7fe65beaee391d30da42e937db621564Steve Block
462d0825bca7fe65beaee391d30da42e937db621564Steve Block    get selectable()
463d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
464d0825bca7fe65beaee391d30da42e937db621564Steve Block        return true;
465d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
466d0825bca7fe65beaee391d30da42e937db621564Steve Block}
467d0825bca7fe65beaee391d30da42e937db621564Steve Block
468d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditResultSidebarTreeElement.prototype.__proto__ = WebInspector.SidebarTreeElement.prototype;
469d0825bca7fe65beaee391d30da42e937db621564Steve Block
470d0825bca7fe65beaee391d30da42e937db621564Steve Block// Contributed audit rules should go into this namespace.
471d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditRules = {};
472d0825bca7fe65beaee391d30da42e937db621564Steve Block
473d0825bca7fe65beaee391d30da42e937db621564Steve Block// Contributed audit categories should go into this namespace.
474d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebInspector.AuditCategories = {};
475