Index: Source/devtools/front_end/network/BlockedURLsPane.js |
diff --git a/Source/devtools/front_end/network/BlockedURLsPane.js b/Source/devtools/front_end/network/BlockedURLsPane.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..113918acde9093302d2c370b6cd05b98c5cf04b3 |
--- /dev/null |
+++ b/Source/devtools/front_end/network/BlockedURLsPane.js |
@@ -0,0 +1,290 @@ |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+/** |
+ * @constructor |
+ * @extends {WebInspector.VBox} |
+ */ |
+WebInspector.BlockedURLsPane = function() |
+{ |
+ WebInspector.VBox.call(this, true); |
+ this.registerRequiredCSS("network/blockedURLsPane.css"); |
+ |
+ this._blockedURLsSetting = WebInspector.moduleSetting("blockedURLs"); |
+ this._blockedURLsSetting.addChangeListener(this._update, this); |
+ |
+ this._toolbar = new WebInspector.Toolbar(this.contentElement); |
+ this._toolbar.element.addEventListener("click", consumeEvent); |
+ this._toolbar.appendToolbarItem(new WebInspector.ToolbarText(WebInspector.UIString("Requests containing following URLs will be blocked"))); |
+ this._toolbar.appendToolbarItem(new WebInspector.ToolbarItem(createElementWithClass("div", "flex-auto-important"))); |
+ var addButton = new WebInspector.ToolbarButton(WebInspector.UIString("Add URL"), "add-toolbar-item"); |
+ addButton.addEventListener("click", this._addButtonClicked.bind(this)); |
+ this._toolbar.appendToolbarItem(addButton); |
+ var clearButton = new WebInspector.ToolbarButton(WebInspector.UIString("Remove all"), "clear-toolbar-item"); |
+ clearButton.addEventListener("click", this._removeAll.bind(this)); |
+ this._toolbar.appendToolbarItem(clearButton); |
+ |
+ this._emptyElement = this.contentElement.createChild("div", "no-blocked-urls"); |
+ this._emptyElement.textContent = WebInspector.UIString("No blocked URLs"); |
+ this._emptyElement.addEventListener("contextmenu", this._emptyElementContextMenu.bind(this), true); |
+ |
+ this._listElement = this.contentElement.createChild("div", "blocked-urls-list"); |
+ this._filterUI = new WebInspector.BlockedURLsPane.FilterUI(); |
+ |
+ /** @type {!Map<string, number>} */ |
+ this._blockedCountForUrl = new Map(); |
+ WebInspector.targetManager.addModelListener(WebInspector.NetworkManager, WebInspector.NetworkManager.EventTypes.RequestFinished, this._onRequestFinished, this); |
+ |
+ this._updateThrottler = new WebInspector.Throttler(200); |
+ |
+ this._update(); |
+} |
+ |
+WebInspector.BlockedURLsPane.prototype = { |
+ /** |
+ * @return {!WebInspector.FilterUI} |
+ */ |
+ filterUI: function() |
+ { |
+ return this._filterUI; |
+ }, |
+ |
+ /** |
+ * @param {!Event} event |
+ */ |
+ _emptyElementContextMenu: function(event) |
+ { |
+ var contextMenu = new WebInspector.ContextMenu(event); |
+ contextMenu.appendItem(WebInspector.UIString.capitalize("Add ^URL"), this._addButtonClicked.bind(this)); |
+ contextMenu.show(); |
+ }, |
+ |
+ _addButtonClicked: function() |
+ { |
+ this._editing = true; |
+ var element = this._createElement("", this._blockedURLsSetting.get().length); |
+ this._listElement.appendChild(element); |
+ element.scrollIntoView(); |
+ |
+ /** |
+ * @param {boolean} accept |
+ * @param {!Element} e |
+ * @param {string} text |
+ * @this {WebInspector.BlockedURLsPane} |
+ */ |
+ function finishEditing(accept, e, text) |
+ { |
+ this._listElement.removeChild(element); |
+ this._editing = false; |
+ if (accept && text) |
+ this._addBlockedURL(text); |
+ else |
+ this._update(); |
+ } |
+ |
+ WebInspector.InplaceEditor.startEditing(element._label, new WebInspector.InplaceEditor.Config(finishEditing.bind(this, true), finishEditing.bind(this, false))); |
+ }, |
+ |
+ /** |
+ * @param {string} url |
+ */ |
+ _addBlockedURL: function(url) |
+ { |
+ var blocked = this._blockedURLsSetting.get(); |
+ blocked.push(url); |
+ this._blockedURLsSetting.set(blocked); |
+ }, |
+ |
+ /** |
+ * @param {number} index |
+ */ |
+ _removeBlockedURL: function(index) |
+ { |
+ var blocked = this._blockedURLsSetting.get(); |
+ blocked.splice(index, 1); |
+ this._blockedURLsSetting.set(blocked); |
+ }, |
+ |
+ /** |
+ * @param {number} index |
+ * @param {string} url |
+ */ |
+ _changeBlockedURL: function(index, url) |
+ { |
+ var blocked = this._blockedURLsSetting.get(); |
+ blocked.splice(index, 1, url); |
+ this._blockedURLsSetting.set(blocked); |
+ }, |
+ |
+ _removeAll: function() |
+ { |
+ this._blockedURLsSetting.set([]); |
+ }, |
+ |
+ /** |
+ * @param {number} index |
+ * @param {!Event} event |
+ */ |
+ _contextMenu: function(index, event) |
+ { |
+ var contextMenu = new WebInspector.ContextMenu(event); |
+ contextMenu.appendItem(WebInspector.UIString.capitalize("Add ^URL"), this._addButtonClicked.bind(this)); |
+ contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^URL"), this._removeBlockedURL.bind(this, index)); |
+ contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^all"), this._removeAll.bind(this)); |
+ contextMenu.show(); |
+ }, |
+ |
+ /** |
+ * @param {!Element} element |
+ * @param {number} index |
+ */ |
+ _labelClicked: function(element, index) |
+ { |
+ this._editing = true; |
+ |
+ /** |
+ * @param {boolean} accept |
+ * @param {!Element} e |
+ * @param {string} text |
+ * @this {WebInspector.BlockedURLsPane} |
+ */ |
+ function finishEditing(accept, e, text) |
+ { |
+ this._editing = false; |
+ if (accept) |
+ this._changeBlockedURL(index, text); |
+ else |
+ this._update(); |
+ } |
+ |
+ WebInspector.InplaceEditor.startEditing(element, new WebInspector.InplaceEditor.Config(finishEditing.bind(this, true), finishEditing.bind(this, false))); |
+ }, |
+ |
+ /** |
+ * @return {!Promise<?>} |
+ */ |
+ _update: function() |
+ { |
+ if (this._editing) |
+ return Promise.resolve(); |
+ |
+ this._listElement.removeChildren(); |
+ var blocked = this._blockedURLsSetting.get(); |
+ for (var index = 0; index < blocked.length; index++) |
+ this._listElement.appendChild(this._createElement(blocked[index], index)); |
+ |
+ this._emptyElement.classList.toggle("hidden", !!blocked.length); |
+ this._filterUI.setActive(!!blocked.length); |
+ this._filterUI.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged); |
+ |
+ return Promise.resolve(); |
+ }, |
+ |
+ /** |
+ * @param {string} url |
+ * @param {number} index |
+ * @return {!Element} |
+ */ |
+ _createElement: function(url, index) |
+ { |
+ var element = createElementWithClass("div", "blocked-url"); |
+ |
+ var label = element.createChild("div", "blocked-url-text"); |
+ element._label = label; |
+ label.textContent = url; |
+ |
+ var count = this._blockedRequestsCount(url); |
+ var countElement = element.createChild("div", "blocked-count monospace"); |
+ countElement.textContent = String.sprintf("[%d]", count); |
+ countElement.title = WebInspector.UIString(count === 1 ? "%d request blocked by this URL" : "%d requests blocked by this URL", count); |
+ |
+ var removeButton = element.createChild("div", "remove-button"); |
+ removeButton.title = WebInspector.UIString("Remove URL"); |
+ removeButton.addEventListener("click", this._removeBlockedURL.bind(this, index), false); |
+ |
+ element.addEventListener("contextmenu", this._contextMenu.bind(this, index), true); |
+ element.addEventListener("dblclick", this._labelClicked.bind(this, label, index), false); |
+ return element; |
+ }, |
+ |
+ /** |
+ * @param {string} url |
+ * @return {number} |
+ */ |
+ _blockedRequestsCount: function(url) |
+ { |
+ if (!url) |
+ return 0; |
+ |
+ var result = 0; |
+ for (var blockedUrl of this._blockedCountForUrl.keys()) { |
+ if (blockedUrl.indexOf(url) !== -1) |
+ result += this._blockedCountForUrl.get(blockedUrl); |
+ } |
+ return result; |
+ }, |
+ |
+ reset: function() |
+ { |
+ this._blockedCountForUrl.clear(); |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.Event} event |
+ */ |
+ _onRequestFinished: function(event) |
+ { |
+ var request = /** @type {!WebInspector.NetworkRequest} */ (event.data); |
+ if (request.blocked) { |
+ var count = this._blockedCountForUrl.get(request.url) || 0; |
+ this._blockedCountForUrl.set(request.url, count + 1); |
+ this._updateThrottler.schedule(this._update.bind(this)); |
+ } |
+ }, |
+ |
+ __proto__: WebInspector.VBox.prototype |
+} |
+ |
+ |
+/** |
+ * @constructor |
+ * @extends {WebInspector.Object} |
+ * @implements {WebInspector.FilterUI} |
+ */ |
+WebInspector.BlockedURLsPane.FilterUI = function() |
+{ |
+ WebInspector.Object.call(this); |
+ this._active = false; |
+ this._element = createElement("span"); |
+} |
+ |
+WebInspector.BlockedURLsPane.FilterUI.prototype = { |
+ /** |
+ * @override |
+ * @return {boolean} |
+ */ |
+ isActive: function() |
+ { |
+ return this._active; |
+ }, |
+ |
+ /** |
+ * @param {boolean} active |
+ */ |
+ setActive: function(active) |
+ { |
+ this._active = active; |
+ }, |
+ |
+ /** |
+ * @override |
+ * @return {!Element} |
+ */ |
+ element: function() |
+ { |
+ return this._element; |
+ }, |
+ |
+ __proto__: WebInspector.Object.prototype |
+} |