| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org> | 3 * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org> |
| 4 * Copyright (C) 2011 Google Inc. All rights reserved. | 4 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * | 9 * |
| 10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
| 11 * notice, this list of conditions and the following disclaimer. | 11 * notice, this list of conditions and the following disclaimer. |
| 12 * 2. Redistributions in binary form must reproduce the above copyright | 12 * 2. Redistributions in binary form must reproduce the above copyright |
| 13 * notice, this list of conditions and the following disclaimer in the | 13 * notice, this list of conditions and the following disclaimer in the |
| 14 * documentation and/or other materials provided with the distribution. | 14 * documentation and/or other materials provided with the distribution. |
| 15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | 15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
| 16 * its contributors may be used to endorse or promote products derived | 16 * its contributors may be used to endorse or promote products derived |
| 17 * from this software without specific prior written permission. | 17 * from this software without specific prior written permission. |
| 18 * | 18 * |
| 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
| 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
| 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | |
| 31 /** | 30 /** |
| 32 * @constructor | |
| 33 * @implements {WebInspector.ContextMenu.Provider} | 31 * @implements {WebInspector.ContextMenu.Provider} |
| 34 * @implements {WebInspector.Searchable} | 32 * @implements {WebInspector.Searchable} |
| 35 * @extends {WebInspector.Panel} | 33 * @unrestricted |
| 36 */ | 34 */ |
| 37 WebInspector.NetworkPanel = function() | 35 WebInspector.NetworkPanel = class extends WebInspector.Panel { |
| 38 { | 36 constructor() { |
| 39 WebInspector.Panel.call(this, "network"); | 37 super('network'); |
| 40 this.registerRequiredCSS("network/networkPanel.css"); | 38 this.registerRequiredCSS('network/networkPanel.css'); |
| 41 | 39 |
| 42 this._networkLogShowOverviewSetting = WebInspector.settings.createSetting("n
etworkLogShowOverview", true); | 40 this._networkLogShowOverviewSetting = WebInspector.settings.createSetting('n
etworkLogShowOverview', true); |
| 43 this._networkLogLargeRowsSetting = WebInspector.settings.createSetting("netw
orkLogLargeRows", false); | 41 this._networkLogLargeRowsSetting = WebInspector.settings.createSetting('netw
orkLogLargeRows', false); |
| 44 this._networkRecordFilmStripSetting = WebInspector.settings.createSetting("n
etworkRecordFilmStripSetting", false); | 42 this._networkRecordFilmStripSetting = WebInspector.settings.createSetting('n
etworkRecordFilmStripSetting', false); |
| 45 this._toggleRecordAction = /** @type {!WebInspector.Action }*/(WebInspector.
actionRegistry.action("network.toggle-recording")); | 43 this._toggleRecordAction = |
| 44 /** @type {!WebInspector.Action }*/ (WebInspector.actionRegistry.action(
'network.toggle-recording')); |
| 46 | 45 |
| 47 /** @type {?WebInspector.FilmStripView} */ | 46 /** @type {?WebInspector.FilmStripView} */ |
| 48 this._filmStripView = null; | 47 this._filmStripView = null; |
| 49 /** @type {?WebInspector.NetworkPanel.FilmStripRecorder} */ | 48 /** @type {?WebInspector.NetworkPanel.FilmStripRecorder} */ |
| 50 this._filmStripRecorder = null; | 49 this._filmStripRecorder = null; |
| 51 | 50 |
| 52 this._panelToolbar = new WebInspector.Toolbar("", this.element); | 51 this._panelToolbar = new WebInspector.Toolbar('', this.element); |
| 53 this._filterBar = new WebInspector.FilterBar("networkPanel", true); | 52 this._filterBar = new WebInspector.FilterBar('networkPanel', true); |
| 54 this._filterBar.show(this.element); | 53 this._filterBar.show(this.element); |
| 55 | 54 |
| 56 // Create top overview component. | 55 // Create top overview component. |
| 57 this._overviewPane = new WebInspector.TimelineOverviewPane("network"); | 56 this._overviewPane = new WebInspector.TimelineOverviewPane('network'); |
| 58 this._overviewPane.addEventListener(WebInspector.TimelineOverviewPane.Events
.WindowChanged, this._onWindowChanged.bind(this)); | 57 this._overviewPane.addEventListener( |
| 59 this._overviewPane.element.id = "network-overview-panel"; | 58 WebInspector.TimelineOverviewPane.Events.WindowChanged, this._onWindowCh
anged.bind(this)); |
| 59 this._overviewPane.element.id = 'network-overview-panel'; |
| 60 this._networkOverview = new WebInspector.NetworkOverview(); | 60 this._networkOverview = new WebInspector.NetworkOverview(); |
| 61 this._overviewPane.setOverviewControls([this._networkOverview]); | 61 this._overviewPane.setOverviewControls([this._networkOverview]); |
| 62 this._calculator = new WebInspector.NetworkTransferTimeCalculator(); | 62 this._calculator = new WebInspector.NetworkTransferTimeCalculator(); |
| 63 | 63 |
| 64 this._splitWidget = new WebInspector.SplitWidget(true, false, "networkPanelS
plitViewState"); | 64 this._splitWidget = new WebInspector.SplitWidget(true, false, 'networkPanelS
plitViewState'); |
| 65 this._splitWidget.hideMain(); | 65 this._splitWidget.hideMain(); |
| 66 | 66 |
| 67 this._splitWidget.show(this.element); | 67 this._splitWidget.show(this.element); |
| 68 | 68 |
| 69 this._progressBarContainer = createElement("div"); | 69 this._progressBarContainer = createElement('div'); |
| 70 this._createToolbarButtons(); | 70 this._createToolbarButtons(); |
| 71 | 71 |
| 72 this._searchableView = new WebInspector.SearchableView(this); | 72 this._searchableView = new WebInspector.SearchableView(this); |
| 73 this._searchableView.setPlaceholder(WebInspector.UIString("Find by filename
or path")); | 73 this._searchableView.setPlaceholder(WebInspector.UIString('Find by filename
or path')); |
| 74 | 74 |
| 75 /** @type {!WebInspector.NetworkLogView} */ | 75 /** @type {!WebInspector.NetworkLogView} */ |
| 76 this._networkLogView = new WebInspector.NetworkLogView(this._filterBar, this
._progressBarContainer, this._networkLogLargeRowsSetting); | 76 this._networkLogView = |
| 77 new WebInspector.NetworkLogView(this._filterBar, this._progressBarContai
ner, this._networkLogLargeRowsSetting); |
| 77 this._networkLogView.show(this._searchableView.element); | 78 this._networkLogView.show(this._searchableView.element); |
| 78 | 79 |
| 79 this._splitWidget.setSidebarWidget(this._searchableView); | 80 this._splitWidget.setSidebarWidget(this._searchableView); |
| 80 | 81 |
| 81 this._detailsWidget = new WebInspector.VBox(); | 82 this._detailsWidget = new WebInspector.VBox(); |
| 82 this._detailsWidget.element.classList.add("network-details-view"); | 83 this._detailsWidget.element.classList.add('network-details-view'); |
| 83 this._splitWidget.setMainWidget(this._detailsWidget); | 84 this._splitWidget.setMainWidget(this._detailsWidget); |
| 84 | 85 |
| 85 this._closeButtonElement = createElement("div", "dt-close-button"); | 86 this._closeButtonElement = createElement('div', 'dt-close-button'); |
| 86 this._closeButtonElement.addEventListener("click", this._showRequest.bind(th
is, null), false); | 87 this._closeButtonElement.addEventListener('click', this._showRequest.bind(th
is, null), false); |
| 87 | 88 |
| 88 this._networkLogShowOverviewSetting.addChangeListener(this._toggleShowOvervi
ew, this); | 89 this._networkLogShowOverviewSetting.addChangeListener(this._toggleShowOvervi
ew, this); |
| 89 this._networkLogLargeRowsSetting.addChangeListener(this._toggleLargerRequest
s, this); | 90 this._networkLogLargeRowsSetting.addChangeListener(this._toggleLargerRequest
s, this); |
| 90 this._networkRecordFilmStripSetting.addChangeListener(this._toggleRecordFilm
Strip, this); | 91 this._networkRecordFilmStripSetting.addChangeListener(this._toggleRecordFilm
Strip, this); |
| 91 | 92 |
| 92 this._toggleRecord(true); | 93 this._toggleRecord(true); |
| 93 this._toggleShowOverview(); | 94 this._toggleShowOverview(); |
| 94 this._toggleLargerRequests(); | 95 this._toggleLargerRequests(); |
| 95 this._toggleRecordFilmStrip(); | 96 this._toggleRecordFilmStrip(); |
| 96 this._updateUI(); | 97 this._updateUI(); |
| 97 | 98 |
| 98 WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel,
WebInspector.ResourceTreeModel.Events.WillReloadPage, this._willReloadPage, this
); | 99 WebInspector.targetManager.addModelListener( |
| 99 WebInspector.targetManager.addModelListener(WebInspector.ResourceTreeModel,
WebInspector.ResourceTreeModel.Events.Load, this._load, this); | 100 WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.Events.Wi
llReloadPage, this._willReloadPage, |
| 100 this._networkLogView.addEventListener(WebInspector.NetworkLogView.Events.Req
uestSelected, this._onRequestSelected, this); | 101 this); |
| 101 this._networkLogView.addEventListener(WebInspector.NetworkLogView.Events.Sea
rchCountUpdated, this._onSearchCountUpdated, this); | 102 WebInspector.targetManager.addModelListener( |
| 102 this._networkLogView.addEventListener(WebInspector.NetworkLogView.Events.Sea
rchIndexUpdated, this._onSearchIndexUpdated, this); | 103 WebInspector.ResourceTreeModel, WebInspector.ResourceTreeModel.Events.Lo
ad, this._load, this); |
| 103 this._networkLogView.addEventListener(WebInspector.NetworkLogView.Events.Upd
ateRequest, this._onUpdateRequest, this); | 104 this._networkLogView.addEventListener( |
| 105 WebInspector.NetworkLogView.Events.RequestSelected, this._onRequestSelec
ted, this); |
| 106 this._networkLogView.addEventListener( |
| 107 WebInspector.NetworkLogView.Events.SearchCountUpdated, this._onSearchCou
ntUpdated, this); |
| 108 this._networkLogView.addEventListener( |
| 109 WebInspector.NetworkLogView.Events.SearchIndexUpdated, this._onSearchInd
exUpdated, this); |
| 110 this._networkLogView.addEventListener( |
| 111 WebInspector.NetworkLogView.Events.UpdateRequest, this._onUpdateRequest,
this); |
| 104 | 112 |
| 105 WebInspector.DataSaverInfobar.maybeShowInPanel(this); | 113 WebInspector.DataSaverInfobar.maybeShowInPanel(this); |
| 106 }; | 114 } |
| 107 | 115 |
| 108 WebInspector.NetworkPanel.displayScreenshotDelay = 1000; | 116 /** |
| 109 | 117 * @param {!Array<{filterType: !WebInspector.NetworkLogView.FilterType, filter
Value: string}>} filters |
| 110 WebInspector.NetworkPanel.prototype = { | 118 */ |
| 119 static revealAndFilter(filters) { |
| 120 var panel = WebInspector.NetworkPanel._instance(); |
| 121 var filterString = ''; |
| 122 for (var filter of filters) |
| 123 filterString += `${filter.filterType}:${filter.filterValue} `; |
| 124 panel._networkLogView.setTextFilterValue(filterString); |
| 125 WebInspector.viewManager.showView('network'); |
| 126 } |
| 127 |
| 128 /** |
| 129 * @return {!WebInspector.NetworkPanel} |
| 130 */ |
| 131 static _instance() { |
| 132 return /** @type {!WebInspector.NetworkPanel} */ (self.runtime.sharedInstanc
e(WebInspector.NetworkPanel)); |
| 133 } |
| 134 |
| 135 /** |
| 136 * @param {!WebInspector.Event} event |
| 137 */ |
| 138 _onWindowChanged(event) { |
| 139 var startTime = Math.max(this._calculator.minimumBoundary(), event.data.star
tTime / 1000); |
| 140 var endTime = Math.min(this._calculator.maximumBoundary(), event.data.endTim
e / 1000); |
| 141 this._networkLogView.setWindow(startTime, endTime); |
| 142 } |
| 143 |
| 144 _createToolbarButtons() { |
| 145 this._panelToolbar.appendToolbarItem(WebInspector.Toolbar.createActionButton
(this._toggleRecordAction)); |
| 146 |
| 147 this._clearButton = new WebInspector.ToolbarButton(WebInspector.UIString('Cl
ear'), 'clear-toolbar-item'); |
| 148 this._clearButton.addEventListener('click', this._onClearButtonClicked, this
); |
| 149 this._panelToolbar.appendToolbarItem(this._clearButton); |
| 150 this._panelToolbar.appendSeparator(); |
| 151 var recordFilmStripButton = new WebInspector.ToolbarSettingToggle( |
| 152 this._networkRecordFilmStripSetting, 'camera-toolbar-item', WebInspector
.UIString('Capture screenshots')); |
| 153 this._panelToolbar.appendToolbarItem(recordFilmStripButton); |
| 154 |
| 155 this._panelToolbar.appendToolbarItem(this._filterBar.filterButton()); |
| 156 this._panelToolbar.appendSeparator(); |
| 157 |
| 158 this._panelToolbar.appendText(WebInspector.UIString('View:')); |
| 159 |
| 160 var largerRequestsButton = new WebInspector.ToolbarSettingToggle( |
| 161 this._networkLogLargeRowsSetting, 'large-list-toolbar-item', WebInspecto
r.UIString('Use large request rows'), |
| 162 WebInspector.UIString('Use small request rows')); |
| 163 this._panelToolbar.appendToolbarItem(largerRequestsButton); |
| 164 |
| 165 var showOverviewButton = new WebInspector.ToolbarSettingToggle( |
| 166 this._networkLogShowOverviewSetting, 'waterfall-toolbar-item', WebInspec
tor.UIString('Show overview'), |
| 167 WebInspector.UIString('Hide overview')); |
| 168 this._panelToolbar.appendToolbarItem(showOverviewButton); |
| 169 this._panelToolbar.appendSeparator(); |
| 170 |
| 171 this._preserveLogCheckbox = new WebInspector.ToolbarCheckbox( |
| 172 WebInspector.UIString('Preserve log'), WebInspector.UIString('Do not cle
ar log on page reload / navigation')); |
| 173 this._preserveLogCheckbox.inputElement.addEventListener( |
| 174 'change', this._onPreserveLogCheckboxChanged.bind(this), false); |
| 175 this._panelToolbar.appendToolbarItem(this._preserveLogCheckbox); |
| 176 |
| 177 this._disableCacheCheckbox = new WebInspector.ToolbarCheckbox( |
| 178 WebInspector.UIString('Disable cache'), WebInspector.UIString('Disable c
ache (while DevTools is open)'), |
| 179 WebInspector.moduleSetting('cacheDisabled')); |
| 180 this._panelToolbar.appendToolbarItem(this._disableCacheCheckbox); |
| 181 |
| 182 this._panelToolbar.appendSeparator(); |
| 183 this._panelToolbar.appendToolbarItem(this._createBlockedURLsButton()); |
| 184 this._panelToolbar.appendToolbarItem(WebInspector.NetworkConditionsSelector.
createOfflineToolbarCheckbox()); |
| 185 this._panelToolbar.appendToolbarItem(this._createNetworkConditionsSelect()); |
| 186 this._panelToolbar.appendToolbarItem(new WebInspector.ToolbarItem(this._prog
ressBarContainer)); |
| 187 } |
| 188 |
| 189 /** |
| 190 * @return {!WebInspector.ToolbarItem} |
| 191 */ |
| 192 _createBlockedURLsButton() { |
| 193 var setting = WebInspector.moduleSetting('blockedURLs'); |
| 194 setting.addChangeListener(updateAction); |
| 195 var action = /** @type {!WebInspector.Action }*/ (WebInspector.actionRegistr
y.action('network.blocked-urls.show')); |
| 196 var button = WebInspector.Toolbar.createActionButton(action); |
| 197 button.setVisible(Runtime.experiments.isEnabled('requestBlocking')); |
| 198 updateAction(); |
| 199 return button; |
| 200 |
| 201 function updateAction() { |
| 202 action.setToggled(!!setting.get().length); |
| 203 } |
| 204 } |
| 205 |
| 206 /** |
| 207 * @return {!WebInspector.ToolbarComboBox} |
| 208 */ |
| 209 _createNetworkConditionsSelect() { |
| 210 var toolbarItem = new WebInspector.ToolbarComboBox(null); |
| 211 toolbarItem.setMaxWidth(140); |
| 212 WebInspector.NetworkConditionsSelector.decorateSelect(toolbarItem.selectElem
ent()); |
| 213 return toolbarItem; |
| 214 } |
| 215 |
| 216 _toggleRecording() { |
| 217 if (!this._preserveLogCheckbox.checked() && !this._toggleRecordAction.toggle
d()) |
| 218 this._reset(); |
| 219 this._toggleRecord(!this._toggleRecordAction.toggled()); |
| 220 } |
| 221 |
| 222 /** |
| 223 * @param {boolean} toggled |
| 224 */ |
| 225 _toggleRecord(toggled) { |
| 226 this._toggleRecordAction.setToggled(toggled); |
| 227 this._networkLogView.setRecording(toggled); |
| 228 if (!toggled && this._filmStripRecorder) |
| 229 this._filmStripRecorder.stopRecording(this._filmStripAvailable.bind(this))
; |
| 230 } |
| 231 |
| 232 /** |
| 233 * @param {?WebInspector.FilmStripModel} filmStripModel |
| 234 */ |
| 235 _filmStripAvailable(filmStripModel) { |
| 236 if (!filmStripModel) |
| 237 return; |
| 238 var calculator = this._networkLogView.timeCalculator(); |
| 239 this._filmStripView.setModel(filmStripModel, calculator.minimumBoundary() *
1000, calculator.boundarySpan() * 1000); |
| 240 this._networkOverview.setFilmStripModel(filmStripModel); |
| 241 var timestamps = filmStripModel.frames().map(mapTimestamp); |
| 242 |
| 111 /** | 243 /** |
| 112 * @param {!WebInspector.Event} event | 244 * @param {!WebInspector.FilmStripModel.Frame} frame |
| 245 * @return {number} |
| 113 */ | 246 */ |
| 114 _onWindowChanged: function(event) | 247 function mapTimestamp(frame) { |
| 115 { | 248 return frame.timestamp / 1000; |
| 116 var startTime = Math.max(this._calculator.minimumBoundary(), event.data.
startTime / 1000); | 249 } |
| 117 var endTime = Math.min(this._calculator.maximumBoundary(), event.data.en
dTime / 1000); | 250 |
| 118 this._networkLogView.setWindow(startTime, endTime); | 251 this._networkLogView.addFilmStripFrames(timestamps); |
| 119 }, | 252 } |
| 120 | 253 |
| 121 _createToolbarButtons: function() | 254 /** |
| 122 { | 255 * @param {!Event} event |
| 123 this._panelToolbar.appendToolbarItem(WebInspector.Toolbar.createActionBu
tton(this._toggleRecordAction)); | 256 */ |
| 124 | 257 _onPreserveLogCheckboxChanged(event) { |
| 125 this._clearButton = new WebInspector.ToolbarButton(WebInspector.UIString
("Clear"), "clear-toolbar-item"); | 258 this._networkLogView.setPreserveLog(this._preserveLogCheckbox.checked()); |
| 126 this._clearButton.addEventListener("click", this._onClearButtonClicked,
this); | 259 } |
| 127 this._panelToolbar.appendToolbarItem(this._clearButton); | 260 |
| 128 this._panelToolbar.appendSeparator(); | 261 /** |
| 129 var recordFilmStripButton = new WebInspector.ToolbarSettingToggle(this._
networkRecordFilmStripSetting, "camera-toolbar-item", WebInspector.UIString("Cap
ture screenshots")); | 262 * @param {!WebInspector.Event} event |
| 130 this._panelToolbar.appendToolbarItem(recordFilmStripButton); | 263 */ |
| 131 | 264 _onClearButtonClicked(event) { |
| 132 this._panelToolbar.appendToolbarItem(this._filterBar.filterButton()); | 265 this._reset(); |
| 133 this._panelToolbar.appendSeparator(); | 266 } |
| 134 | 267 |
| 135 this._panelToolbar.appendText(WebInspector.UIString("View:")); | 268 _reset() { |
| 136 | 269 this._calculator.reset(); |
| 137 var largerRequestsButton = new WebInspector.ToolbarSettingToggle(this._n
etworkLogLargeRowsSetting, "large-list-toolbar-item", WebInspector.UIString("Use
large request rows"), WebInspector.UIString("Use small request rows")); | 270 this._overviewPane.reset(); |
| 138 this._panelToolbar.appendToolbarItem(largerRequestsButton); | 271 this._networkLogView.reset(); |
| 139 | 272 WebInspector.BlockedURLsPane.reset(); |
| 140 var showOverviewButton = new WebInspector.ToolbarSettingToggle(this._net
workLogShowOverviewSetting, "waterfall-toolbar-item", WebInspector.UIString("Sho
w overview"), WebInspector.UIString("Hide overview")); | 273 if (this._filmStripView) |
| 141 this._panelToolbar.appendToolbarItem(showOverviewButton); | 274 this._resetFilmStripView(); |
| 142 this._panelToolbar.appendSeparator(); | 275 } |
| 143 | 276 |
| 144 this._preserveLogCheckbox = new WebInspector.ToolbarCheckbox(WebInspecto
r.UIString("Preserve log"), WebInspector.UIString("Do not clear log on page relo
ad / navigation")); | 277 /** |
| 145 this._preserveLogCheckbox.inputElement.addEventListener("change", this._
onPreserveLogCheckboxChanged.bind(this), false); | 278 * @param {!WebInspector.Event} event |
| 146 this._panelToolbar.appendToolbarItem(this._preserveLogCheckbox); | 279 */ |
| 147 | 280 _willReloadPage(event) { |
| 148 this._disableCacheCheckbox = new WebInspector.ToolbarCheckbox(WebInspect
or.UIString("Disable cache"), WebInspector.UIString("Disable cache (while DevToo
ls is open)"), WebInspector.moduleSetting("cacheDisabled")); | 281 if (!this._preserveLogCheckbox.checked()) |
| 149 this._panelToolbar.appendToolbarItem(this._disableCacheCheckbox); | 282 this._reset(); |
| 150 | 283 this._toggleRecord(true); |
| 151 this._panelToolbar.appendSeparator(); | 284 if (this._pendingStopTimer) { |
| 152 this._panelToolbar.appendToolbarItem(this._createBlockedURLsButton()); | 285 clearTimeout(this._pendingStopTimer); |
| 153 this._panelToolbar.appendToolbarItem(WebInspector.NetworkConditionsSelec
tor.createOfflineToolbarCheckbox()); | 286 delete this._pendingStopTimer; |
| 154 this._panelToolbar.appendToolbarItem(this._createNetworkConditionsSelect
()); | 287 } |
| 155 this._panelToolbar.appendToolbarItem(new WebInspector.ToolbarItem(this._
progressBarContainer)); | 288 if (this.isShowing() && this._filmStripRecorder) |
| 156 }, | 289 this._filmStripRecorder.startRecording(); |
| 157 | 290 } |
| 291 |
| 292 /** |
| 293 * @param {!WebInspector.Event} event |
| 294 */ |
| 295 _load(event) { |
| 296 if (this._filmStripRecorder && this._filmStripRecorder.isRecording()) |
| 297 this._pendingStopTimer = |
| 298 setTimeout(this._stopFilmStripRecording.bind(this), WebInspector.Netwo
rkPanel.displayScreenshotDelay); |
| 299 } |
| 300 |
| 301 _stopFilmStripRecording() { |
| 302 this._filmStripRecorder.stopRecording(this._filmStripAvailable.bind(this)); |
| 303 delete this._pendingStopTimer; |
| 304 } |
| 305 |
| 306 _toggleLargerRequests() { |
| 307 this._updateUI(); |
| 308 } |
| 309 |
| 310 _toggleShowOverview() { |
| 311 var toggled = this._networkLogShowOverviewSetting.get(); |
| 312 if (toggled) |
| 313 this._overviewPane.show(this.element, this._splitWidget.element); |
| 314 else |
| 315 this._overviewPane.detach(); |
| 316 this.doResize(); |
| 317 } |
| 318 |
| 319 _toggleRecordFilmStrip() { |
| 320 var toggled = this._networkRecordFilmStripSetting.get(); |
| 321 if (toggled && !this._filmStripRecorder) { |
| 322 this._filmStripView = new WebInspector.FilmStripView(); |
| 323 this._filmStripView.setMode(WebInspector.FilmStripView.Modes.FrameBased); |
| 324 this._filmStripView.element.classList.add('network-film-strip'); |
| 325 this._filmStripRecorder = |
| 326 new WebInspector.NetworkPanel.FilmStripRecorder(this._networkLogView.t
imeCalculator(), this._filmStripView); |
| 327 this._filmStripView.show(this.element, this.element.firstElementChild); |
| 328 this._filmStripView.addEventListener( |
| 329 WebInspector.FilmStripView.Events.FrameSelected, this._onFilmFrameSele
cted, this); |
| 330 this._filmStripView.addEventListener(WebInspector.FilmStripView.Events.Fra
meEnter, this._onFilmFrameEnter, this); |
| 331 this._filmStripView.addEventListener(WebInspector.FilmStripView.Events.Fra
meExit, this._onFilmFrameExit, this); |
| 332 this._resetFilmStripView(); |
| 333 } |
| 334 |
| 335 if (!toggled && this._filmStripRecorder) { |
| 336 this._filmStripView.detach(); |
| 337 this._filmStripView = null; |
| 338 this._filmStripRecorder = null; |
| 339 } |
| 340 } |
| 341 |
| 342 _resetFilmStripView() { |
| 343 this._filmStripView.reset(); |
| 344 this._filmStripView.setStatusText(WebInspector.UIString( |
| 345 'Hit %s to reload and capture filmstrip.', |
| 346 WebInspector.shortcutRegistry.shortcutDescriptorsForAction('main.reload'
)[0].name)); |
| 347 } |
| 348 |
| 349 /** |
| 350 * @override |
| 351 * @return {!Array.<!Element>} |
| 352 */ |
| 353 elementsToRestoreScrollPositionsFor() { |
| 354 return this._networkLogView.elementsToRestoreScrollPositionsFor(); |
| 355 } |
| 356 |
| 357 /** |
| 358 * @override |
| 359 * @return {!WebInspector.SearchableView} |
| 360 */ |
| 361 searchableView() { |
| 362 return this._searchableView; |
| 363 } |
| 364 |
| 365 /** |
| 366 * @override |
| 367 * @param {!KeyboardEvent} event |
| 368 */ |
| 369 handleShortcut(event) { |
| 370 if (this._networkItemView && event.keyCode === WebInspector.KeyboardShortcut
.Keys.Esc.code) { |
| 371 this._showRequest(null); |
| 372 event.handled = true; |
| 373 return; |
| 374 } |
| 375 |
| 376 super.handleShortcut(event); |
| 377 } |
| 378 |
| 379 /** |
| 380 * @override |
| 381 */ |
| 382 wasShown() { |
| 383 WebInspector.context.setFlavor(WebInspector.NetworkPanel, this); |
| 384 } |
| 385 |
| 386 /** |
| 387 * @override |
| 388 */ |
| 389 willHide() { |
| 390 WebInspector.context.setFlavor(WebInspector.NetworkPanel, null); |
| 391 } |
| 392 |
| 393 /** |
| 394 * @param {!WebInspector.NetworkRequest} request |
| 395 */ |
| 396 revealAndHighlightRequest(request) { |
| 397 this._showRequest(null); |
| 398 if (request) |
| 399 this._networkLogView.revealAndHighlightRequest(request); |
| 400 } |
| 401 |
| 402 /** |
| 403 * @param {!WebInspector.Event} event |
| 404 */ |
| 405 _onRowSizeChanged(event) { |
| 406 this._updateUI(); |
| 407 } |
| 408 |
| 409 /** |
| 410 * @param {!WebInspector.Event} event |
| 411 */ |
| 412 _onSearchCountUpdated(event) { |
| 413 var count = /** @type {number} */ (event.data); |
| 414 this._searchableView.updateSearchMatchesCount(count); |
| 415 } |
| 416 |
| 417 /** |
| 418 * @param {!WebInspector.Event} event |
| 419 */ |
| 420 _onSearchIndexUpdated(event) { |
| 421 var index = /** @type {number} */ (event.data); |
| 422 this._searchableView.updateCurrentMatchIndex(index); |
| 423 } |
| 424 |
| 425 /** |
| 426 * @param {!WebInspector.Event} event |
| 427 */ |
| 428 _onRequestSelected(event) { |
| 429 var request = /** @type {?WebInspector.NetworkRequest} */ (event.data); |
| 430 this._showRequest(request); |
| 431 } |
| 432 |
| 433 /** |
| 434 * @param {?WebInspector.NetworkRequest} request |
| 435 */ |
| 436 _showRequest(request) { |
| 437 if (this._networkItemView) { |
| 438 this._networkItemView.detach(); |
| 439 this._networkItemView = null; |
| 440 } |
| 441 |
| 442 if (request) { |
| 443 this._networkItemView = new WebInspector.NetworkItemView(request, this._ne
tworkLogView.timeCalculator()); |
| 444 this._networkItemView.leftToolbar().appendToolbarItem(new WebInspector.Too
lbarItem(this._closeButtonElement)); |
| 445 this._networkItemView.show(this._detailsWidget.element); |
| 446 this._splitWidget.showBoth(); |
| 447 } else { |
| 448 this._splitWidget.hideMain(); |
| 449 this._networkLogView.clearSelection(); |
| 450 } |
| 451 this._updateUI(); |
| 452 } |
| 453 |
| 454 _updateUI() { |
| 455 this._detailsWidget.element.classList.toggle( |
| 456 'network-details-view-tall-header', this._networkLogLargeRowsSetting.get
()); |
| 457 this._networkLogView.switchViewMode(!this._splitWidget.isResizable()); |
| 458 } |
| 459 |
| 460 /** |
| 461 * @override |
| 462 * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
| 463 * @param {boolean} shouldJump |
| 464 * @param {boolean=} jumpBackwards |
| 465 */ |
| 466 performSearch(searchConfig, shouldJump, jumpBackwards) { |
| 467 this._networkLogView.performSearch(searchConfig, shouldJump, jumpBackwards); |
| 468 } |
| 469 |
| 470 /** |
| 471 * @override |
| 472 */ |
| 473 jumpToPreviousSearchResult() { |
| 474 this._networkLogView.jumpToPreviousSearchResult(); |
| 475 } |
| 476 |
| 477 /** |
| 478 * @override |
| 479 * @return {boolean} |
| 480 */ |
| 481 supportsCaseSensitiveSearch() { |
| 482 return false; |
| 483 } |
| 484 |
| 485 /** |
| 486 * @override |
| 487 * @return {boolean} |
| 488 */ |
| 489 supportsRegexSearch() { |
| 490 return false; |
| 491 } |
| 492 |
| 493 /** |
| 494 * @override |
| 495 */ |
| 496 jumpToNextSearchResult() { |
| 497 this._networkLogView.jumpToNextSearchResult(); |
| 498 } |
| 499 |
| 500 /** |
| 501 * @override |
| 502 */ |
| 503 searchCanceled() { |
| 504 this._networkLogView.searchCanceled(); |
| 505 } |
| 506 |
| 507 /** |
| 508 * @override |
| 509 * @param {!Event} event |
| 510 * @param {!WebInspector.ContextMenu} contextMenu |
| 511 * @param {!Object} target |
| 512 * @this {WebInspector.NetworkPanel} |
| 513 */ |
| 514 appendApplicableItems(event, contextMenu, target) { |
| 158 /** | 515 /** |
| 159 * @return {!WebInspector.ToolbarItem} | |
| 160 */ | |
| 161 _createBlockedURLsButton: function() | |
| 162 { | |
| 163 var setting = WebInspector.moduleSetting("blockedURLs"); | |
| 164 setting.addChangeListener(updateAction); | |
| 165 var action = /** @type {!WebInspector.Action }*/(WebInspector.actionRegi
stry.action("network.blocked-urls.show")); | |
| 166 var button = WebInspector.Toolbar.createActionButton(action); | |
| 167 button.setVisible(Runtime.experiments.isEnabled("requestBlocking")); | |
| 168 updateAction(); | |
| 169 return button; | |
| 170 | |
| 171 function updateAction() | |
| 172 { | |
| 173 action.setToggled(!!setting.get().length); | |
| 174 } | |
| 175 }, | |
| 176 | |
| 177 /** | |
| 178 * @return {!WebInspector.ToolbarComboBox} | |
| 179 */ | |
| 180 _createNetworkConditionsSelect: function() | |
| 181 { | |
| 182 var toolbarItem = new WebInspector.ToolbarComboBox(null); | |
| 183 toolbarItem.setMaxWidth(140); | |
| 184 WebInspector.NetworkConditionsSelector.decorateSelect(toolbarItem.select
Element()); | |
| 185 return toolbarItem; | |
| 186 }, | |
| 187 | |
| 188 _toggleRecording: function() | |
| 189 { | |
| 190 if (!this._preserveLogCheckbox.checked() && !this._toggleRecordAction.to
ggled()) | |
| 191 this._reset(); | |
| 192 this._toggleRecord(!this._toggleRecordAction.toggled()); | |
| 193 }, | |
| 194 | |
| 195 /** | |
| 196 * @param {boolean} toggled | |
| 197 */ | |
| 198 _toggleRecord: function(toggled) | |
| 199 { | |
| 200 this._toggleRecordAction.setToggled(toggled); | |
| 201 this._networkLogView.setRecording(toggled); | |
| 202 if (!toggled && this._filmStripRecorder) | |
| 203 this._filmStripRecorder.stopRecording(this._filmStripAvailable.bind(
this)); | |
| 204 }, | |
| 205 | |
| 206 /** | |
| 207 * @param {?WebInspector.FilmStripModel} filmStripModel | |
| 208 */ | |
| 209 _filmStripAvailable: function(filmStripModel) | |
| 210 { | |
| 211 if (!filmStripModel) | |
| 212 return; | |
| 213 var calculator = this._networkLogView.timeCalculator(); | |
| 214 this._filmStripView.setModel(filmStripModel, calculator.minimumBoundary(
) * 1000, calculator.boundarySpan() * 1000); | |
| 215 this._networkOverview.setFilmStripModel(filmStripModel); | |
| 216 var timestamps = filmStripModel.frames().map(mapTimestamp); | |
| 217 | |
| 218 /** | |
| 219 * @param {!WebInspector.FilmStripModel.Frame} frame | |
| 220 * @return {number} | |
| 221 */ | |
| 222 function mapTimestamp(frame) | |
| 223 { | |
| 224 return frame.timestamp / 1000; | |
| 225 } | |
| 226 | |
| 227 this._networkLogView.addFilmStripFrames(timestamps); | |
| 228 }, | |
| 229 | |
| 230 /** | |
| 231 * @param {!Event} event | |
| 232 */ | |
| 233 _onPreserveLogCheckboxChanged: function(event) | |
| 234 { | |
| 235 this._networkLogView.setPreserveLog(this._preserveLogCheckbox.checked())
; | |
| 236 }, | |
| 237 | |
| 238 /** | |
| 239 * @param {!WebInspector.Event} event | |
| 240 */ | |
| 241 _onClearButtonClicked: function(event) | |
| 242 { | |
| 243 this._reset(); | |
| 244 }, | |
| 245 | |
| 246 _reset: function() | |
| 247 { | |
| 248 this._calculator.reset(); | |
| 249 this._overviewPane.reset(); | |
| 250 this._networkLogView.reset(); | |
| 251 WebInspector.BlockedURLsPane.reset(); | |
| 252 if (this._filmStripView) | |
| 253 this._resetFilmStripView(); | |
| 254 }, | |
| 255 | |
| 256 /** | |
| 257 * @param {!WebInspector.Event} event | |
| 258 */ | |
| 259 _willReloadPage: function(event) | |
| 260 { | |
| 261 if (!this._preserveLogCheckbox.checked()) | |
| 262 this._reset(); | |
| 263 this._toggleRecord(true); | |
| 264 if (this._pendingStopTimer) { | |
| 265 clearTimeout(this._pendingStopTimer); | |
| 266 delete this._pendingStopTimer; | |
| 267 } | |
| 268 if (this.isShowing() && this._filmStripRecorder) | |
| 269 this._filmStripRecorder.startRecording(); | |
| 270 }, | |
| 271 | |
| 272 /** | |
| 273 * @param {!WebInspector.Event} event | |
| 274 */ | |
| 275 _load: function(event) | |
| 276 { | |
| 277 if (this._filmStripRecorder && this._filmStripRecorder.isRecording()) | |
| 278 this._pendingStopTimer = setTimeout(this._stopFilmStripRecording.bin
d(this), WebInspector.NetworkPanel.displayScreenshotDelay); | |
| 279 }, | |
| 280 | |
| 281 _stopFilmStripRecording: function() | |
| 282 { | |
| 283 this._filmStripRecorder.stopRecording(this._filmStripAvailable.bind(this
)); | |
| 284 delete this._pendingStopTimer; | |
| 285 }, | |
| 286 | |
| 287 _toggleLargerRequests: function() | |
| 288 { | |
| 289 this._updateUI(); | |
| 290 }, | |
| 291 | |
| 292 _toggleShowOverview: function() | |
| 293 { | |
| 294 var toggled = this._networkLogShowOverviewSetting.get(); | |
| 295 if (toggled) | |
| 296 this._overviewPane.show(this.element, this._splitWidget.element); | |
| 297 else | |
| 298 this._overviewPane.detach(); | |
| 299 this.doResize(); | |
| 300 }, | |
| 301 | |
| 302 _toggleRecordFilmStrip: function() | |
| 303 { | |
| 304 var toggled = this._networkRecordFilmStripSetting.get(); | |
| 305 if (toggled && !this._filmStripRecorder) { | |
| 306 this._filmStripView = new WebInspector.FilmStripView(); | |
| 307 this._filmStripView.setMode(WebInspector.FilmStripView.Modes.FrameBa
sed); | |
| 308 this._filmStripView.element.classList.add("network-film-strip"); | |
| 309 this._filmStripRecorder = new WebInspector.NetworkPanel.FilmStripRec
order(this._networkLogView.timeCalculator(), this._filmStripView); | |
| 310 this._filmStripView.show(this.element, this.element.firstElementChil
d); | |
| 311 this._filmStripView.addEventListener(WebInspector.FilmStripView.Even
ts.FrameSelected, this._onFilmFrameSelected, this); | |
| 312 this._filmStripView.addEventListener(WebInspector.FilmStripView.Even
ts.FrameEnter, this._onFilmFrameEnter, this); | |
| 313 this._filmStripView.addEventListener(WebInspector.FilmStripView.Even
ts.FrameExit, this._onFilmFrameExit, this); | |
| 314 this._resetFilmStripView(); | |
| 315 } | |
| 316 | |
| 317 if (!toggled && this._filmStripRecorder) { | |
| 318 this._filmStripView.detach(); | |
| 319 this._filmStripView = null; | |
| 320 this._filmStripRecorder = null; | |
| 321 } | |
| 322 }, | |
| 323 | |
| 324 _resetFilmStripView: function() | |
| 325 { | |
| 326 this._filmStripView.reset(); | |
| 327 this._filmStripView.setStatusText(WebInspector.UIString("Hit %s to reloa
d and capture filmstrip.", WebInspector.shortcutRegistry.shortcutDescriptorsForA
ction("main.reload")[0].name)); | |
| 328 }, | |
| 329 | |
| 330 /** | |
| 331 * @override | |
| 332 * @return {!Array.<!Element>} | |
| 333 */ | |
| 334 elementsToRestoreScrollPositionsFor: function() | |
| 335 { | |
| 336 return this._networkLogView.elementsToRestoreScrollPositionsFor(); | |
| 337 }, | |
| 338 | |
| 339 /** | |
| 340 * @override | |
| 341 * @return {!WebInspector.SearchableView} | |
| 342 */ | |
| 343 searchableView: function() | |
| 344 { | |
| 345 return this._searchableView; | |
| 346 }, | |
| 347 | |
| 348 /** | |
| 349 * @override | |
| 350 * @param {!KeyboardEvent} event | |
| 351 */ | |
| 352 handleShortcut: function(event) | |
| 353 { | |
| 354 if (this._networkItemView && event.keyCode === WebInspector.KeyboardShor
tcut.Keys.Esc.code) { | |
| 355 this._showRequest(null); | |
| 356 event.handled = true; | |
| 357 return; | |
| 358 } | |
| 359 | |
| 360 WebInspector.Panel.prototype.handleShortcut.call(this, event); | |
| 361 }, | |
| 362 | |
| 363 wasShown: function() | |
| 364 { | |
| 365 WebInspector.context.setFlavor(WebInspector.NetworkPanel, this); | |
| 366 }, | |
| 367 | |
| 368 willHide: function() | |
| 369 { | |
| 370 WebInspector.context.setFlavor(WebInspector.NetworkPanel, null); | |
| 371 }, | |
| 372 | |
| 373 /** | |
| 374 * @param {!WebInspector.NetworkRequest} request | |
| 375 */ | |
| 376 revealAndHighlightRequest: function(request) | |
| 377 { | |
| 378 this._showRequest(null); | |
| 379 if (request) | |
| 380 this._networkLogView.revealAndHighlightRequest(request); | |
| 381 }, | |
| 382 | |
| 383 /** | |
| 384 * @param {!WebInspector.Event} event | |
| 385 */ | |
| 386 _onRowSizeChanged: function(event) | |
| 387 { | |
| 388 this._updateUI(); | |
| 389 }, | |
| 390 | |
| 391 /** | |
| 392 * @param {!WebInspector.Event} event | |
| 393 */ | |
| 394 _onSearchCountUpdated: function(event) | |
| 395 { | |
| 396 var count = /** @type {number} */ (event.data); | |
| 397 this._searchableView.updateSearchMatchesCount(count); | |
| 398 }, | |
| 399 | |
| 400 /** | |
| 401 * @param {!WebInspector.Event} event | |
| 402 */ | |
| 403 _onSearchIndexUpdated: function(event) | |
| 404 { | |
| 405 var index = /** @type {number} */ (event.data); | |
| 406 this._searchableView.updateCurrentMatchIndex(index); | |
| 407 }, | |
| 408 | |
| 409 /** | |
| 410 * @param {!WebInspector.Event} event | |
| 411 */ | |
| 412 _onRequestSelected: function(event) | |
| 413 { | |
| 414 var request = /** @type {?WebInspector.NetworkRequest} */ (event.data); | |
| 415 this._showRequest(request); | |
| 416 }, | |
| 417 | |
| 418 /** | |
| 419 * @param {?WebInspector.NetworkRequest} request | |
| 420 */ | |
| 421 _showRequest: function(request) | |
| 422 { | |
| 423 if (this._networkItemView) { | |
| 424 this._networkItemView.detach(); | |
| 425 this._networkItemView = null; | |
| 426 } | |
| 427 | |
| 428 if (request) { | |
| 429 this._networkItemView = new WebInspector.NetworkItemView(request, th
is._networkLogView.timeCalculator()); | |
| 430 this._networkItemView.leftToolbar().appendToolbarItem(new WebInspect
or.ToolbarItem(this._closeButtonElement)); | |
| 431 this._networkItemView.show(this._detailsWidget.element); | |
| 432 this._splitWidget.showBoth(); | |
| 433 } else { | |
| 434 this._splitWidget.hideMain(); | |
| 435 this._networkLogView.clearSelection(); | |
| 436 } | |
| 437 this._updateUI(); | |
| 438 }, | |
| 439 | |
| 440 _updateUI: function() | |
| 441 { | |
| 442 this._detailsWidget.element.classList.toggle("network-details-view-tall-
header", this._networkLogLargeRowsSetting.get()); | |
| 443 this._networkLogView.switchViewMode(!this._splitWidget.isResizable()); | |
| 444 }, | |
| 445 | |
| 446 /** | |
| 447 * @override | |
| 448 * @param {!WebInspector.SearchableView.SearchConfig} searchConfig | |
| 449 * @param {boolean} shouldJump | |
| 450 * @param {boolean=} jumpBackwards | |
| 451 */ | |
| 452 performSearch: function(searchConfig, shouldJump, jumpBackwards) | |
| 453 { | |
| 454 this._networkLogView.performSearch(searchConfig, shouldJump, jumpBackwar
ds); | |
| 455 }, | |
| 456 | |
| 457 /** | |
| 458 * @override | |
| 459 */ | |
| 460 jumpToPreviousSearchResult: function() | |
| 461 { | |
| 462 this._networkLogView.jumpToPreviousSearchResult(); | |
| 463 }, | |
| 464 | |
| 465 /** | |
| 466 * @override | |
| 467 * @return {boolean} | |
| 468 */ | |
| 469 supportsCaseSensitiveSearch: function() | |
| 470 { | |
| 471 return false; | |
| 472 }, | |
| 473 | |
| 474 /** | |
| 475 * @override | |
| 476 * @return {boolean} | |
| 477 */ | |
| 478 supportsRegexSearch: function() | |
| 479 { | |
| 480 return false; | |
| 481 }, | |
| 482 | |
| 483 /** | |
| 484 * @override | |
| 485 */ | |
| 486 jumpToNextSearchResult: function() | |
| 487 { | |
| 488 this._networkLogView.jumpToNextSearchResult(); | |
| 489 }, | |
| 490 | |
| 491 /** | |
| 492 * @override | |
| 493 */ | |
| 494 searchCanceled: function() | |
| 495 { | |
| 496 this._networkLogView.searchCanceled(); | |
| 497 }, | |
| 498 | |
| 499 /** | |
| 500 * @override | |
| 501 * @param {!Event} event | |
| 502 * @param {!WebInspector.ContextMenu} contextMenu | |
| 503 * @param {!Object} target | |
| 504 * @this {WebInspector.NetworkPanel} | 516 * @this {WebInspector.NetworkPanel} |
| 505 */ | 517 */ |
| 506 appendApplicableItems: function(event, contextMenu, target) | 518 function reveal(request) { |
| 507 { | 519 WebInspector.viewManager.showView('network').then(this.revealAndHighlightR
equest.bind(this, request)); |
| 508 /** | 520 } |
| 509 * @this {WebInspector.NetworkPanel} | |
| 510 */ | |
| 511 function reveal(request) | |
| 512 { | |
| 513 WebInspector.viewManager.showView("network").then(this.revealAndHigh
lightRequest.bind(this, request)); | |
| 514 } | |
| 515 | |
| 516 /** | |
| 517 * @this {WebInspector.NetworkPanel} | |
| 518 */ | |
| 519 function appendRevealItem(request) | |
| 520 { | |
| 521 contextMenu.appendItem(WebInspector.UIString.capitalize("Reveal in N
etwork ^panel"), reveal.bind(this, request)); | |
| 522 } | |
| 523 | |
| 524 if (event.target.isSelfOrDescendant(this.element)) | |
| 525 return; | |
| 526 | |
| 527 if (target instanceof WebInspector.Resource) { | |
| 528 var resource = /** @type {!WebInspector.Resource} */ (target); | |
| 529 if (resource.request) | |
| 530 appendRevealItem.call(this, resource.request); | |
| 531 return; | |
| 532 } | |
| 533 if (target instanceof WebInspector.UISourceCode) { | |
| 534 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (target
); | |
| 535 var resource = WebInspector.resourceForURL(uiSourceCode.url()); | |
| 536 if (resource && resource.request) | |
| 537 appendRevealItem.call(this, resource.request); | |
| 538 return; | |
| 539 } | |
| 540 | |
| 541 if (!(target instanceof WebInspector.NetworkRequest)) | |
| 542 return; | |
| 543 var request = /** @type {!WebInspector.NetworkRequest} */ (target); | |
| 544 if (this._networkItemView && this._networkItemView.isShowing() && this._
networkItemView.request() === request) | |
| 545 return; | |
| 546 | |
| 547 appendRevealItem.call(this, request); | |
| 548 }, | |
| 549 | 521 |
| 550 /** | 522 /** |
| 551 * @param {!WebInspector.Event} event | 523 * @this {WebInspector.NetworkPanel} |
| 552 */ | 524 */ |
| 553 _onFilmFrameSelected: function(event) | 525 function appendRevealItem(request) { |
| 554 { | 526 contextMenu.appendItem(WebInspector.UIString.capitalize('Reveal in Network
^panel'), reveal.bind(this, request)); |
| 555 var timestamp = /** @type {number} */ (event.data); | 527 } |
| 556 this._overviewPane.requestWindowTimes(0, timestamp); | 528 |
| 557 }, | 529 if (event.target.isSelfOrDescendant(this.element)) |
| 558 | 530 return; |
| 559 /** | 531 |
| 560 * @param {!WebInspector.Event} event | 532 if (target instanceof WebInspector.Resource) { |
| 561 */ | 533 var resource = /** @type {!WebInspector.Resource} */ (target); |
| 562 _onFilmFrameEnter: function(event) | 534 if (resource.request) |
| 563 { | 535 appendRevealItem.call(this, resource.request); |
| 564 var timestamp = /** @type {number} */ (event.data); | 536 return; |
| 565 this._networkOverview.selectFilmStripFrame(timestamp); | 537 } |
| 566 this._networkLogView.selectFilmStripFrame(timestamp / 1000); | 538 if (target instanceof WebInspector.UISourceCode) { |
| 567 }, | 539 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (target); |
| 568 | 540 var resource = WebInspector.resourceForURL(uiSourceCode.url()); |
| 569 /** | 541 if (resource && resource.request) |
| 570 * @param {!WebInspector.Event} event | 542 appendRevealItem.call(this, resource.request); |
| 571 */ | 543 return; |
| 572 _onFilmFrameExit: function(event) | 544 } |
| 573 { | 545 |
| 574 this._networkOverview.clearFilmStripFrame(); | 546 if (!(target instanceof WebInspector.NetworkRequest)) |
| 575 this._networkLogView.clearFilmStripFrame(); | 547 return; |
| 576 }, | 548 var request = /** @type {!WebInspector.NetworkRequest} */ (target); |
| 577 | 549 if (this._networkItemView && this._networkItemView.isShowing() && this._netw
orkItemView.request() === request) |
| 578 /** | 550 return; |
| 579 * @param {!WebInspector.Event} event | 551 |
| 580 */ | 552 appendRevealItem.call(this, request); |
| 581 _onUpdateRequest: function(event) | 553 } |
| 582 { | 554 |
| 583 var request = /** @type {!WebInspector.NetworkRequest} */ (event.data); | 555 /** |
| 584 this._calculator.updateBoundaries(request); | 556 * @param {!WebInspector.Event} event |
| 585 // FIXME: Unify all time units across the frontend! | 557 */ |
| 586 this._overviewPane.setBounds(this._calculator.minimumBoundary() * 1000,
this._calculator.maximumBoundary() * 1000); | 558 _onFilmFrameSelected(event) { |
| 587 this._networkOverview.updateRequest(request); | 559 var timestamp = /** @type {number} */ (event.data); |
| 588 this._overviewPane.scheduleUpdate(); | 560 this._overviewPane.requestWindowTimes(0, timestamp); |
| 589 }, | 561 } |
| 590 | 562 |
| 591 __proto__: WebInspector.Panel.prototype | 563 /** |
| 564 * @param {!WebInspector.Event} event |
| 565 */ |
| 566 _onFilmFrameEnter(event) { |
| 567 var timestamp = /** @type {number} */ (event.data); |
| 568 this._networkOverview.selectFilmStripFrame(timestamp); |
| 569 this._networkLogView.selectFilmStripFrame(timestamp / 1000); |
| 570 } |
| 571 |
| 572 /** |
| 573 * @param {!WebInspector.Event} event |
| 574 */ |
| 575 _onFilmFrameExit(event) { |
| 576 this._networkOverview.clearFilmStripFrame(); |
| 577 this._networkLogView.clearFilmStripFrame(); |
| 578 } |
| 579 |
| 580 /** |
| 581 * @param {!WebInspector.Event} event |
| 582 */ |
| 583 _onUpdateRequest(event) { |
| 584 var request = /** @type {!WebInspector.NetworkRequest} */ (event.data); |
| 585 this._calculator.updateBoundaries(request); |
| 586 // FIXME: Unify all time units across the frontend! |
| 587 this._overviewPane.setBounds(this._calculator.minimumBoundary() * 1000, this
._calculator.maximumBoundary() * 1000); |
| 588 this._networkOverview.updateRequest(request); |
| 589 this._overviewPane.scheduleUpdate(); |
| 590 } |
| 592 }; | 591 }; |
| 593 | 592 |
| 593 WebInspector.NetworkPanel.displayScreenshotDelay = 1000; |
| 594 |
| 594 /** | 595 /** |
| 595 * @constructor | |
| 596 * @implements {WebInspector.ContextMenu.Provider} | 596 * @implements {WebInspector.ContextMenu.Provider} |
| 597 * @unrestricted |
| 597 */ | 598 */ |
| 598 WebInspector.NetworkPanel.ContextMenuProvider = function() | 599 WebInspector.NetworkPanel.ContextMenuProvider = class { |
| 599 { | 600 /** |
| 601 * @override |
| 602 * @param {!Event} event |
| 603 * @param {!WebInspector.ContextMenu} contextMenu |
| 604 * @param {!Object} target |
| 605 */ |
| 606 appendApplicableItems(event, contextMenu, target) { |
| 607 WebInspector.NetworkPanel._instance().appendApplicableItems(event, contextMe
nu, target); |
| 608 } |
| 600 }; | 609 }; |
| 601 | 610 |
| 602 WebInspector.NetworkPanel.ContextMenuProvider.prototype = { | 611 /** |
| 603 /** | 612 * @implements {WebInspector.Revealer} |
| 604 * @override | 613 * @unrestricted |
| 605 * @param {!Event} event | 614 */ |
| 606 * @param {!WebInspector.ContextMenu} contextMenu | 615 WebInspector.NetworkPanel.RequestRevealer = class { |
| 607 * @param {!Object} target | 616 /** |
| 608 */ | 617 * @override |
| 609 appendApplicableItems: function(event, contextMenu, target) | 618 * @param {!Object} request |
| 610 { | 619 * @return {!Promise} |
| 611 WebInspector.NetworkPanel._instance().appendApplicableItems(event, conte
xtMenu, target); | 620 */ |
| 612 } | 621 reveal(request) { |
| 622 if (!(request instanceof WebInspector.NetworkRequest)) |
| 623 return Promise.reject(new Error('Internal error: not a network request')); |
| 624 var panel = WebInspector.NetworkPanel._instance(); |
| 625 return WebInspector.viewManager.showView('network').then(panel.revealAndHigh
lightRequest.bind(panel, request)); |
| 626 } |
| 613 }; | 627 }; |
| 614 | 628 |
| 629 |
| 615 /** | 630 /** |
| 616 * @constructor | 631 * @implements {WebInspector.TracingManagerClient} |
| 617 * @implements {WebInspector.Revealer} | 632 * @unrestricted |
| 618 */ | 633 */ |
| 619 WebInspector.NetworkPanel.RequestRevealer = function() | 634 WebInspector.NetworkPanel.FilmStripRecorder = class { |
| 620 { | 635 /** |
| 621 }; | 636 * @param {!WebInspector.NetworkTimeCalculator} timeCalculator |
| 622 | 637 * @param {!WebInspector.FilmStripView} filmStripView |
| 623 WebInspector.NetworkPanel.RequestRevealer.prototype = { | 638 */ |
| 624 /** | 639 constructor(timeCalculator, filmStripView) { |
| 625 * @override | |
| 626 * @param {!Object} request | |
| 627 * @return {!Promise} | |
| 628 */ | |
| 629 reveal: function(request) | |
| 630 { | |
| 631 if (!(request instanceof WebInspector.NetworkRequest)) | |
| 632 return Promise.reject(new Error("Internal error: not a network reque
st")); | |
| 633 var panel = WebInspector.NetworkPanel._instance(); | |
| 634 return WebInspector.viewManager.showView("network").then(panel.revealAnd
HighlightRequest.bind(panel, request)); | |
| 635 } | |
| 636 }; | |
| 637 | |
| 638 /** | |
| 639 * @param {!Array<{filterType: !WebInspector.NetworkLogView.FilterType, filterVa
lue: string}>} filters | |
| 640 */ | |
| 641 WebInspector.NetworkPanel.revealAndFilter = function(filters) | |
| 642 { | |
| 643 var panel = WebInspector.NetworkPanel._instance(); | |
| 644 var filterString = ""; | |
| 645 for (var filter of filters) | |
| 646 filterString += `${filter.filterType}:${filter.filterValue} `; | |
| 647 panel._networkLogView.setTextFilterValue(filterString); | |
| 648 WebInspector.viewManager.showView("network"); | |
| 649 }; | |
| 650 | |
| 651 /** | |
| 652 * @return {!WebInspector.NetworkPanel} | |
| 653 */ | |
| 654 WebInspector.NetworkPanel._instance = function() | |
| 655 { | |
| 656 return /** @type {!WebInspector.NetworkPanel} */ (self.runtime.sharedInstanc
e(WebInspector.NetworkPanel)); | |
| 657 }; | |
| 658 | |
| 659 /** | |
| 660 * @constructor | |
| 661 * @implements {WebInspector.TracingManagerClient} | |
| 662 * @param {!WebInspector.NetworkTimeCalculator} timeCalculator | |
| 663 * @param {!WebInspector.FilmStripView} filmStripView | |
| 664 */ | |
| 665 WebInspector.NetworkPanel.FilmStripRecorder = function(timeCalculator, filmStrip
View) | |
| 666 { | |
| 667 this._timeCalculator = timeCalculator; | 640 this._timeCalculator = timeCalculator; |
| 668 this._filmStripView = filmStripView; | 641 this._filmStripView = filmStripView; |
| 642 } |
| 643 |
| 644 /** |
| 645 * @override |
| 646 */ |
| 647 tracingStarted() { |
| 648 } |
| 649 |
| 650 /** |
| 651 * @override |
| 652 * @param {!Array.<!WebInspector.TracingManager.EventPayload>} events |
| 653 */ |
| 654 traceEventsCollected(events) { |
| 655 if (this._tracingModel) |
| 656 this._tracingModel.addEvents(events); |
| 657 } |
| 658 |
| 659 /** |
| 660 * @override |
| 661 */ |
| 662 tracingComplete() { |
| 663 if (!this._tracingModel) |
| 664 return; |
| 665 this._tracingModel.tracingComplete(); |
| 666 WebInspector.targetManager.resumeReload(this._target); |
| 667 this._target = null; |
| 668 this._callback(new WebInspector.FilmStripModel(this._tracingModel, this._tim
eCalculator.minimumBoundary() * 1000)); |
| 669 delete this._callback; |
| 670 } |
| 671 |
| 672 /** |
| 673 * @override |
| 674 */ |
| 675 tracingBufferUsage() { |
| 676 } |
| 677 |
| 678 /** |
| 679 * @override |
| 680 * @param {number} progress |
| 681 */ |
| 682 eventsRetrievalProgress(progress) { |
| 683 } |
| 684 |
| 685 startRecording() { |
| 686 this._filmStripView.reset(); |
| 687 this._filmStripView.setStatusText(WebInspector.UIString('Recording frames...
')); |
| 688 if (this._target) |
| 689 return; |
| 690 |
| 691 this._target = WebInspector.targetManager.mainTarget(); |
| 692 if (this._tracingModel) |
| 693 this._tracingModel.reset(); |
| 694 else |
| 695 this._tracingModel = new WebInspector.TracingModel(new WebInspector.TempFi
leBackingStorage('tracing')); |
| 696 this._target.tracingManager.start(this, '-*,disabled-by-default-devtools.scr
eenshot', ''); |
| 697 } |
| 698 |
| 699 /** |
| 700 * @return {boolean} |
| 701 */ |
| 702 isRecording() { |
| 703 return !!this._target; |
| 704 } |
| 705 |
| 706 /** |
| 707 * @param {function(?WebInspector.FilmStripModel)} callback |
| 708 */ |
| 709 stopRecording(callback) { |
| 710 if (!this._target) |
| 711 return; |
| 712 |
| 713 this._target.tracingManager.stop(); |
| 714 WebInspector.targetManager.suspendReload(this._target); |
| 715 this._callback = callback; |
| 716 this._filmStripView.setStatusText(WebInspector.UIString('Fetching frames...'
)); |
| 717 } |
| 669 }; | 718 }; |
| 670 | 719 |
| 671 WebInspector.NetworkPanel.FilmStripRecorder.prototype = { | 720 /** |
| 672 /** | 721 * @implements {WebInspector.ActionDelegate} |
| 673 * @override | 722 * @unrestricted |
| 674 */ | 723 */ |
| 675 tracingStarted: function() | 724 WebInspector.NetworkPanel.RecordActionDelegate = class { |
| 676 { | 725 /** |
| 677 }, | 726 * @override |
| 678 | 727 * @param {!WebInspector.Context} context |
| 679 /** | 728 * @param {string} actionId |
| 680 * @override | 729 * @return {boolean} |
| 681 * @param {!Array.<!WebInspector.TracingManager.EventPayload>} events | 730 */ |
| 682 */ | 731 handleAction(context, actionId) { |
| 683 traceEventsCollected: function(events) | 732 var panel = WebInspector.context.flavor(WebInspector.NetworkPanel); |
| 684 { | 733 console.assert(panel && panel instanceof WebInspector.NetworkPanel); |
| 685 if (this._tracingModel) | 734 panel._toggleRecording(); |
| 686 this._tracingModel.addEvents(events); | 735 return true; |
| 687 }, | 736 } |
| 688 | |
| 689 /** | |
| 690 * @override | |
| 691 */ | |
| 692 tracingComplete: function() | |
| 693 { | |
| 694 if (!this._tracingModel) | |
| 695 return; | |
| 696 this._tracingModel.tracingComplete(); | |
| 697 WebInspector.targetManager.resumeReload(this._target); | |
| 698 this._target = null; | |
| 699 this._callback(new WebInspector.FilmStripModel(this._tracingModel, this.
_timeCalculator.minimumBoundary() * 1000)); | |
| 700 delete this._callback; | |
| 701 }, | |
| 702 | |
| 703 /** | |
| 704 * @override | |
| 705 */ | |
| 706 tracingBufferUsage: function() | |
| 707 { | |
| 708 }, | |
| 709 | |
| 710 /** | |
| 711 * @override | |
| 712 * @param {number} progress | |
| 713 */ | |
| 714 eventsRetrievalProgress: function(progress) | |
| 715 { | |
| 716 }, | |
| 717 | |
| 718 startRecording: function() | |
| 719 { | |
| 720 this._filmStripView.reset(); | |
| 721 this._filmStripView.setStatusText(WebInspector.UIString("Recording frame
s...")); | |
| 722 if (this._target) | |
| 723 return; | |
| 724 | |
| 725 this._target = WebInspector.targetManager.mainTarget(); | |
| 726 if (this._tracingModel) | |
| 727 this._tracingModel.reset(); | |
| 728 else | |
| 729 this._tracingModel = new WebInspector.TracingModel(new WebInspector.
TempFileBackingStorage("tracing")); | |
| 730 this._target.tracingManager.start(this, "-*,disabled-by-default-devtools
.screenshot", ""); | |
| 731 }, | |
| 732 | |
| 733 /** | |
| 734 * @return {boolean} | |
| 735 */ | |
| 736 isRecording: function() | |
| 737 { | |
| 738 return !!this._target; | |
| 739 }, | |
| 740 | |
| 741 /** | |
| 742 * @param {function(?WebInspector.FilmStripModel)} callback | |
| 743 */ | |
| 744 stopRecording: function(callback) | |
| 745 { | |
| 746 if (!this._target) | |
| 747 return; | |
| 748 | |
| 749 this._target.tracingManager.stop(); | |
| 750 WebInspector.targetManager.suspendReload(this._target); | |
| 751 this._callback = callback; | |
| 752 this._filmStripView.setStatusText(WebInspector.UIString("Fetching frames
...")); | |
| 753 } | |
| 754 }; | 737 }; |
| 755 | |
| 756 /** | |
| 757 * @constructor | |
| 758 * @implements {WebInspector.ActionDelegate} | |
| 759 */ | |
| 760 WebInspector.NetworkPanel.RecordActionDelegate = function() | |
| 761 { | |
| 762 }; | |
| 763 WebInspector.NetworkPanel.RecordActionDelegate.prototype = { | |
| 764 /** | |
| 765 * @override | |
| 766 * @param {!WebInspector.Context} context | |
| 767 * @param {string} actionId | |
| 768 * @return {boolean} | |
| 769 */ | |
| 770 handleAction: function(context, actionId) | |
| 771 { | |
| 772 var panel = WebInspector.context.flavor(WebInspector.NetworkPanel); | |
| 773 console.assert(panel && panel instanceof WebInspector.NetworkPanel); | |
| 774 panel._toggleRecording(); | |
| 775 return true; | |
| 776 } | |
| 777 }; | |
| OLD | NEW |