| /* | |
| * Copyright (C) 2011 Google Inc. All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are | |
| * met: | |
| * | |
| * * Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * * Redistributions in binary form must reproduce the above | |
| * copyright notice, this list of conditions and the following disclaimer | |
| * in the documentation and/or other materials provided with the | |
| * distribution. | |
| * * Neither the name of Google Inc. nor the names of its | |
| * contributors may be used to endorse or promote products derived from | |
| * this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| export default class RequestCookiesView extends UI.Widget { | |
| /** | |
| * @param {!SDK.NetworkRequest} request | |
| */ | |
| constructor(request) { | |
| super(); | |
| this.registerRequiredCSS('network/requestCookiesView.css'); | |
| this.element.classList.add('request-cookies-view'); | |
| /** @type {!SDK.NetworkRequest} */ | |
| this._request = request; | |
| /** @type {?Array<!SDK.Cookie>} */ | |
| this._detailedRequestCookies = null; | |
| this._showFilteredOutCookiesSetting = | |
| Common.settings.createSetting('show-filtered-out-request-cookies', /* defaultValue */ false); | |
| this._emptyWidget = new UI.EmptyWidget(Common.UIString('This request has no cookies.')); | |
| this._emptyWidget.show(this.element); | |
| this._requestCookiesTitle = this.element.createChild('div'); | |
| const titleText = this._requestCookiesTitle.createChild('span', 'request-cookies-title'); | |
| titleText.textContent = ls`Request Cookies`; | |
| titleText.title = ls`Cookies that were sent to the server in the 'cookie' header of the request`; | |
| const requestCookiesCheckbox = UI.SettingsUI.createSettingCheckbox( | |
| ls`show filtered out request cookies`, this._showFilteredOutCookiesSetting, | |
| /* omitParagraphElement */ true); | |
| requestCookiesCheckbox.checkboxElement.addEventListener('change', () => { | |
| this._refreshRequestCookiesView(); | |
| }); | |
| this._requestCookiesTitle.appendChild(requestCookiesCheckbox); | |
| this._requestCookiesEmpty = this.element.createChild('div', 'cookies-panel-item'); | |
| this._requestCookiesEmpty.textContent = ls`No request cookies were sent.`; | |
| this._requestCookiesTable = new CookieTable.CookiesTable(/* renderInline */ true); | |
| this._requestCookiesTable.contentElement.classList.add('cookie-table', 'cookies-panel-item'); | |
| this._requestCookiesTable.show(this.element); | |
| this._responseCookiesTitle = this.element.createChild('div', 'request-cookies-title'); | |
| this._responseCookiesTitle.textContent = ls`Response Cookies`; | |
| this._responseCookiesTitle.title = | |
| ls`Cookies that were received from the server in the 'set-cookie' header of the response`; | |
| this._responseCookiesTable = new CookieTable.CookiesTable(/* renderInline */ true); | |
| this._responseCookiesTable.contentElement.classList.add('cookie-table', 'cookies-panel-item'); | |
| this._responseCookiesTable.show(this.element); | |
| this._malformedResponseCookiesTitle = this.element.createChild('div', 'request-cookies-title'); | |
| this._malformedResponseCookiesTitle.textContent = ls`Malformed Response Cookies`; | |
| this._malformedResponseCookiesTitle.title = ls | |
| `Cookies that were received from the server in the 'set-cookie' header of the response but were malformed`; | |
| this._malformedResponseCookiesList = this.element.createChild('div'); | |
| } | |
| /** | |
| * @return {!{requestCookies: !Array<!SDK.Cookie>, requestCookieToBlockedReasons: !Map<!SDK.Cookie, !Array<!CookieTable.BlockedReason>>}} | |
| */ | |
| _getRequestCookies() { | |
| let requestCookies = []; | |
| /** @type {!Map<!SDK.Cookie, !Array<!CookieTable.BlockedReason>>} */ | |
| const requestCookieToBlockedReasons = new Map(); | |
| if (this._request.requestCookies) { | |
| requestCookies = this._request.requestCookies.slice(); | |
| // request.requestCookies are generated from headers which are missing | |
| // cookie attributes that we can fetch from the backend. | |
| if (this._detailedRequestCookies) { | |
| requestCookies = requestCookies.map(cookie => { | |
| for (const detailedCookie of (this._detailedRequestCookies || [])) { | |
| if (detailedCookie.name() === cookie.name() && detailedCookie.value() === cookie.value()) { | |
| return detailedCookie; | |
| } | |
| } | |
| return cookie; | |
| }); | |
| } else { | |
| const networkManager = SDK.NetworkManager.forRequest(this._request); | |
| if (networkManager) { | |
| const cookieModel = networkManager.target().model(SDK.CookieModel); | |
| if (cookieModel) { | |
| cookieModel.getCookies([this._request.url()]).then(cookies => { | |
| this._detailedRequestCookies = cookies; | |
| this._refreshRequestCookiesView(); | |
| }); | |
| } | |
| } | |
| } | |
| } | |
| if (this._showFilteredOutCookiesSetting.get()) { | |
| for (const blockedCookie of this._request.blockedRequestCookies()) { | |
| requestCookieToBlockedReasons.set(blockedCookie.cookie, blockedCookie.blockedReasons.map(blockedReason => { | |
| return { | |
| attribute: SDK.NetworkRequest.cookieBlockedReasonToAttribute(blockedReason), | |
| uiString: SDK.NetworkRequest.cookieBlockedReasonToUiString(blockedReason) | |
| }; | |
| })); | |
| requestCookies.push(blockedCookie.cookie); | |
| } | |
| } | |
| return {requestCookies, requestCookieToBlockedReasons}; | |
| } | |
| /** | |
| * @return {!{responseCookies: !Array<!SDK.Cookie>, responseCookieToBlockedReasons: !Map<!SDK.Cookie, !Array<!CookieTable.BlockedReason>>, malformedResponseCookies: !Array<!SDK.NetworkRequest.BlockedSetCookieWithReason>}} | |
| */ | |
| _getResponseCookies() { | |
| /** @type {!Array<!SDK.Cookie>} */ | |
| let responseCookies = []; | |
| /** @type {!Map<!SDK.Cookie, !Array<!CookieTable.BlockedReason>>} */ | |
| const responseCookieToBlockedReasons = new Map(); | |
| /** @type {!Array<!SDK.NetworkRequest.BlockedSetCookieWithReason>} */ | |
| const malformedResponseCookies = []; | |
| if (this._request.responseCookies) { | |
| const blockedCookieLines = this._request.blockedResponseCookies().map(blockedCookie => blockedCookie.cookieLine); | |
| responseCookies = this._request.responseCookies.filter(cookie => { | |
| // remove the regular cookies that would overlap with blocked cookies | |
| if (blockedCookieLines.includes(cookie.getCookieLine())) { | |
| blockedCookieLines.remove(cookie.getCookieLine(), /* firstOnly */ true); | |
| return false; | |
| } | |
| return true; | |
| }); | |
| for (const blockedCookie of this._request.blockedResponseCookies()) { | |
| const parsedCookies = SDK.CookieParser.parseSetCookie(blockedCookie.cookieLine); | |
| if (!parsedCookies.length || | |
| blockedCookie.blockedReasons.includes(Protocol.Network.SetCookieBlockedReason.SyntaxError)) { | |
| malformedResponseCookies.push(blockedCookie); | |
| continue; | |
| } | |
| const cookie = parsedCookies[0]; | |
| responseCookieToBlockedReasons.set(cookie, blockedCookie.blockedReasons.map(blockedReason => { | |
| return { | |
| attribute: SDK.NetworkRequest.setCookieBlockedReasonToAttribute(blockedReason), | |
| uiString: SDK.NetworkRequest.setCookieBlockedReasonToUiString(blockedReason) | |
| }; | |
| })); | |
| responseCookies.push(cookie); | |
| } | |
| } | |
| return {responseCookies, responseCookieToBlockedReasons, malformedResponseCookies}; | |
| } | |
| _refreshRequestCookiesView() { | |
| if (!this.isShowing()) { | |
| return; | |
| } | |
| const {requestCookies, requestCookieToBlockedReasons} = this._getRequestCookies(); | |
| const {responseCookies, responseCookieToBlockedReasons, malformedResponseCookies} = this._getResponseCookies(); | |
| if (requestCookies.length) { | |
| this._requestCookiesTitle.classList.remove('hidden'); | |
| this._requestCookiesEmpty.classList.add('hidden'); | |
| this._requestCookiesTable.showWidget(); | |
| this._requestCookiesTable.setCookies(requestCookies, requestCookieToBlockedReasons); | |
| } else if (this._request.blockedRequestCookies().length) { | |
| this._requestCookiesTitle.classList.remove('hidden'); | |
| this._requestCookiesEmpty.classList.remove('hidden'); | |
| this._requestCookiesTable.hideWidget(); | |
| } else { | |
| this._requestCookiesTitle.classList.add('hidden'); | |
| this._requestCookiesEmpty.classList.add('hidden'); | |
| this._requestCookiesTable.hideWidget(); | |
| } | |
| if (responseCookies.length) { | |
| this._responseCookiesTitle.classList.remove('hidden'); | |
| this._responseCookiesTable.showWidget(); | |
| this._responseCookiesTable.setCookies(responseCookies, responseCookieToBlockedReasons); | |
| } else { | |
| this._responseCookiesTitle.classList.add('hidden'); | |
| this._responseCookiesTable.hideWidget(); | |
| } | |
| if (malformedResponseCookies.length) { | |
| this._malformedResponseCookiesTitle.classList.remove('hidden'); | |
| this._malformedResponseCookiesList.classList.remove('hidden'); | |
| this._malformedResponseCookiesList.removeChildren(); | |
| for (const malformedCookie of malformedResponseCookies) { | |
| const listItem = this._malformedResponseCookiesList.createChild('span', 'cookie-line source-code'); | |
| const icon = UI.Icon.create('smallicon-error', 'cookie-warning-icon'); | |
| listItem.appendChild(icon); | |
| listItem.createTextChild(malformedCookie.cookieLine); | |
| listItem.title = | |
| SDK.NetworkRequest.setCookieBlockedReasonToUiString(Protocol.Network.SetCookieBlockedReason.SyntaxError); | |
| } | |
| } else { | |
| this._malformedResponseCookiesTitle.classList.add('hidden'); | |
| this._malformedResponseCookiesList.classList.add('hidden'); | |
| } | |
| } | |
| /** | |
| * @override | |
| */ | |
| wasShown() { | |
| this._request.addEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this._cookiesUpdated, this); | |
| this._request.addEventListener(SDK.NetworkRequest.Events.ResponseHeadersChanged, this._cookiesUpdated, this); | |
| if (this._gotCookies()) { | |
| this._refreshRequestCookiesView(); | |
| this._emptyWidget.hideWidget(); | |
| } else { | |
| this._emptyWidget.showWidget(); | |
| } | |
| } | |
| /** | |
| * @override | |
| */ | |
| willHide() { | |
| this._request.removeEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this._cookiesUpdated, this); | |
| this._request.removeEventListener(SDK.NetworkRequest.Events.ResponseHeadersChanged, this._cookiesUpdated, this); | |
| } | |
| /** | |
| * @return {boolean} | |
| */ | |
| _gotCookies() { | |
| return !!(this._request.requestCookies && this._request.requestCookies.length) || | |
| !!(this._request.responseCookies && this._request.responseCookies.length); | |
| } | |
| _cookiesUpdated() { | |
| if (!this.isShowing()) { | |
| return; | |
| } | |
| if (this._gotCookies()) { | |
| this._refreshRequestCookiesView(); | |
| this._emptyWidget.hideWidget(); | |
| } else { | |
| this._emptyWidget.showWidget(); | |
| } | |
| } | |
| } | |
| /* Legacy exported object */ | |
| self.Network = self.Network || {}; | |
| /* Legacy exported object */ | |
| Network = Network || {}; | |
| /** | |
| * @constructor | |
| */ | |
| Network.RequestCookiesView = RequestCookiesView; |