From 5baf806cdeaa65a5ed71cb169bd2cb6b34eb02c7 Mon Sep 17 00:00:00 2001 From: Ricky Chien Date: Sat, 23 Dec 2017 14:03:24 +0800 Subject: [PATCH] Bug 1426809 - Prevent fetching network update packet again after packet arrived r=Honza MozReview-Commit-ID: 5Ifgj1opsNW --HG-- extra : rebase_source : 9ddd273520657db459df15c9a52cef120d669c51 --- .../src/connector/firefox-data-provider.js | 31 ++------ .../src/widgets/RequestListContextMenu.js | 76 +++++++++++-------- 2 files changed, 51 insertions(+), 56 deletions(-) diff --git a/devtools/client/netmonitor/src/connector/firefox-data-provider.js b/devtools/client/netmonitor/src/connector/firefox-data-provider.js index 9449c5a4c503..4fd9c5761b1c 100644 --- a/devtools/client/netmonitor/src/connector/firefox-data-provider.js +++ b/devtools/client/netmonitor/src/connector/firefox-data-provider.js @@ -134,10 +134,6 @@ class FirefoxDataProvider { let response = await this.getLongString(text); responseContent.content.text = response; payload.responseContent = responseContent; - - // Lock down responseContentAvailable once we fetch data from back-end. - // Using this as flag to prevent fetching arrived data again. - payload.responseContentAvailable = false; } return payload; } @@ -149,10 +145,6 @@ class FirefoxDataProvider { if (headers) { payload.requestHeaders = headers; } - - // Lock down requestHeadersAvailable once we fetch data from back-end. - // Using this as flag to prevent fetching arrived data again. - payload.requestHeadersAvailable = false; } return payload; } @@ -164,10 +156,6 @@ class FirefoxDataProvider { if (headers) { payload.responseHeaders = headers; } - - // Lock down responseHeadersAvailable once we fetch data from back-end. - // Using this as flag to prevent fetching arrived data again. - payload.responseHeadersAvailable = false; } return payload; } @@ -188,10 +176,6 @@ class FirefoxDataProvider { requestPostData.postData.text = postData; payload.requestPostData = Object.assign({}, requestPostData); payload.requestHeadersFromUploadStream = { headers, headersSize }; - - // Lock down requestPostDataAvailable once we fetch data from back-end. - // Using this as flag to prevent fetching arrived data again. - payload.requestPostDataAvailable = false; } return payload; } @@ -214,10 +198,6 @@ class FirefoxDataProvider { payload.requestCookies = reqCookies; } } - - // Lock down requestCookiesAvailable once we fetch data from back-end. - // Using this as flag to prevent fetching arrived data again. - payload.requestCookiesAvailable = false; } return payload; } @@ -240,10 +220,6 @@ class FirefoxDataProvider { payload.responseCookies = resCookies; } } - - // Lock down responseCookiesAvailable once we fetch data from back-end. - // Using this as flag to prevent fetching arrived data again. - payload.responseCookiesAvailable = false; } return payload; } @@ -434,7 +410,12 @@ class FirefoxDataProvider { this.lazyRequestData.delete(key); if (this.actions.updateRequest) { - await this.actions.updateRequest(actor, payload, true); + await this.actions.updateRequest(actor, { + ...payload, + // Lockdown *Available property once we fetch data from back-end. + // Using this as a flag to prevent fetching arrived data again. + [`${method}Available`]: false, + }, true); } return payload; diff --git a/devtools/client/netmonitor/src/widgets/RequestListContextMenu.js b/devtools/client/netmonitor/src/widgets/RequestListContextMenu.js index 9fd618ff1960..7e116611f435 100644 --- a/devtools/client/netmonitor/src/widgets/RequestListContextMenu.js +++ b/devtools/client/netmonitor/src/widgets/RequestListContextMenu.js @@ -40,6 +40,7 @@ class RequestListContextMenu { requestPostDataAvailable, responseHeaders, responseHeadersAvailable, + responseContent, responseContentAvailable, url, } = selectedRequest; @@ -73,7 +74,7 @@ class RequestListContextMenu { // Menu item will be visible even if data hasn't arrived, so we need to check // *Available property and then fetch data lazily once user triggers the action. visible: !!(selectedRequest && (requestPostDataAvailable || requestPostData)), - click: () => this.copyPostData(id, formDataSections), + click: () => this.copyPostData(id, formDataSections, requestPostData), }); copySubmenu.push({ @@ -82,8 +83,11 @@ class RequestListContextMenu { accesskey: L10N.getStr("netmonitor.context.copyAsCurl.accesskey"), // Menu item will be visible even if data hasn't arrived, so we need to check // *Available property and then fetch data lazily once user triggers the action. - visible: !!(selectedRequest && (requestHeadersAvailable || requestHeaders)), - click: () => this.copyAsCurl(id, url, method, requestHeaders, httpVersion), + visible: !!(selectedRequest && + (requestHeadersAvailable || requestHeaders) && + (responseContentAvailable || responseContent)), + click: () => + this.copyAsCurl(id, url, method, httpVersion, requestHeaders, responseContent), }); copySubmenu.push({ @@ -117,16 +121,17 @@ class RequestListContextMenu { accesskey: L10N.getStr("netmonitor.context.copyResponse.accesskey"), // Menu item will be visible even if data hasn't arrived, so we need to check // *Available property and then fetch data lazily once user triggers the action. - visible: !!(selectedRequest && responseContentAvailable), - click: () => this.copyResponse(id), + visible: !!(selectedRequest && (responseContentAvailable || responseContent)), + click: () => this.copyResponse(id, responseContent), }); copySubmenu.push({ id: "request-list-context-copy-image-as-data-uri", label: L10N.getStr("netmonitor.context.copyImageAsDataUri"), accesskey: L10N.getStr("netmonitor.context.copyImageAsDataUri.accesskey"), - visible: !!(selectedRequest && mimeType && mimeType.includes("image/")), - click: () => this.copyImageAsDataUri(id, mimeType), + visible: !!(selectedRequest && (responseContentAvailable || responseContent) && + mimeType && mimeType.includes("image/")), + click: () => this.copyImageAsDataUri(id, mimeType, responseContent), }); copySubmenu.push({ @@ -161,8 +166,9 @@ class RequestListContextMenu { id: "request-list-context-save-image-as", label: L10N.getStr("netmonitor.context.saveImageAs"), accesskey: L10N.getStr("netmonitor.context.saveImageAs.accesskey"), - visible: !!(selectedRequest && mimeType && mimeType.includes("image/")), - click: () => this.saveImageAs(id, url), + visible: !!(selectedRequest && (responseContentAvailable || responseContent) && + mimeType && mimeType.includes("image/")), + click: () => this.saveImageAs(id, url, responseContent), }); menu.push({ @@ -263,7 +269,7 @@ class RequestListContextMenu { * Copy the request form data parameters (or raw payload) from * the currently selected item. */ - async copyPostData(id, formDataSections) { + async copyPostData(id, formDataSections, requestPostData) { let params = []; // Try to extract any form data parameters. formDataSections.forEach(section => { @@ -279,8 +285,9 @@ class RequestListContextMenu { // Fall back to raw payload. if (!string) { - let { requestPostData } = await this.props.connector - .requestData(id, "requestPostData"); + requestPostData = requestPostData || + await this.props.connector.requestData(id, "requestPostData").requestPostData; + string = requestPostData.postData.text; if (Services.appinfo.OS !== "WINNT") { string = string.replace(/\r/g, ""); @@ -292,18 +299,19 @@ class RequestListContextMenu { /** * Copy a cURL command from the currently selected item. */ - async copyAsCurl(id, url, method, requestHeaders, httpVersion) { - if (!requestHeaders) { - requestHeaders = await this.props.connector.requestData(id, "requestHeaders"); - } - let { requestPostData } = await this.props.connector - .requestData(id, "requestPostData"); + async copyAsCurl(id, url, method, httpVersion, requestHeaders, requestPostData) { + requestHeaders = requestHeaders || + await this.props.connector.requestData(id, "requestHeaders"); + + requestPostData = requestPostData || + await this.props.connector.requestData(id, "requestPostData").requestPostData; + // Create a sanitized object for the Curl command generator. let data = { url, method, headers: requestHeaders.headers, - httpVersion: httpVersion, + httpVersion, postDataText: requestPostData ? requestPostData.postData.text : "", }; copyString(Curl.generateCommand(data)); @@ -313,9 +321,9 @@ class RequestListContextMenu { * Copy the raw request headers from the currently selected item. */ async copyRequestHeaders(id, requestHeaders) { - if (!requestHeaders) { - requestHeaders = await this.props.connector.requestData(id, "requestHeaders"); - } + requestHeaders = requestHeaders || + await this.props.connector.requestData(id, "requestHeaders"); + let rawHeaders = requestHeaders.rawHeaders.trim(); if (Services.appinfo.OS !== "WINNT") { @@ -328,9 +336,9 @@ class RequestListContextMenu { * Copy the raw response headers from the currently selected item. */ async copyResponseHeaders(id, responseHeaders) { - if (!responseHeaders) { - responseHeaders = await this.props.connector.requestData(id, "responseHeaders"); - } + responseHeaders = responseHeaders || + await this.props.connector.requestData(id, "responseHeaders"); + let rawHeaders = responseHeaders.rawHeaders.trim(); if (Services.appinfo.OS !== "WINNT") { @@ -342,8 +350,10 @@ class RequestListContextMenu { /** * Copy image as data uri. */ - async copyImageAsDataUri(id, mimeType) { - let responseContent = await this.props.connector.requestData(id, "responseContent"); + async copyImageAsDataUri(id, mimeType, responseContent) { + responseContent = responseContent || + await this.props.connector.requestData(id, "responseContent"); + let { encoding, text } = responseContent.content; copyString(formDataURI(mimeType, encoding, text)); } @@ -351,8 +361,10 @@ class RequestListContextMenu { /** * Save image as. */ - async saveImageAs(id, url) { - let responseContent = await this.props.connector.requestData(id, "responseContent"); + async saveImageAs(id, url, responseContent) { + responseContent = responseContent || + await this.props.connector.requestData(id, "responseContent"); + let { encoding, text } = responseContent.content; let fileName = getUrlBaseName(url); let data; @@ -371,8 +383,10 @@ class RequestListContextMenu { /** * Copy response data as a string. */ - async copyResponse(id) { - let responseContent = await this.props.connector.requestData(id, "responseContent"); + async copyResponse(id, responseContent) { + responseContent = responseContent || + await this.props.connector.requestData(id, "responseContent"); + copyString(responseContent.content.text); }