зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1355833 - Fix broken context menu actions r=Honza
MozReview-Commit-ID: 4g8kLH5LD97 --HG-- extra : rebase_source : 3eb0843fdc1e1e3d62b03980ce8142ea2c4a67d3
This commit is contained in:
Родитель
8f16cb5be3
Коммит
db262e9484
|
@ -8,6 +8,7 @@ const Services = require("Services");
|
|||
const appInfo = Services.appinfo;
|
||||
const { LocalizationHelper } = require("devtools/shared/l10n");
|
||||
const { CurlUtils } = require("devtools/client/shared/curl");
|
||||
const { getLongString } = require("../utils/client");
|
||||
const {
|
||||
getFormDataSections,
|
||||
getUrlQuery,
|
||||
|
@ -269,6 +270,7 @@ HarBuilder.prototype = {
|
|||
file.requestHeaders,
|
||||
file.requestHeadersFromUploadStream,
|
||||
file.requestPostData,
|
||||
getLongString,
|
||||
).then(formDataSections => {
|
||||
formDataSections.forEach(section => {
|
||||
let paramsArray = parseQueryString(section);
|
||||
|
|
|
@ -8,22 +8,20 @@ const Services = require("Services");
|
|||
const { Curl } = require("devtools/client/shared/curl");
|
||||
const { gDevTools } = require("devtools/client/framework/devtools");
|
||||
const { showMenu } = require("devtools/client/netmonitor/src/utils/menu");
|
||||
const FileSaver = require("devtools/client/shared/file-saver");
|
||||
const clipboardHelper = require("devtools/shared/platform/clipboard");
|
||||
const { saveAs } = require("devtools/client/shared/file-saver");
|
||||
const { copyString } = require("devtools/shared/platform/clipboard");
|
||||
const { HarExporter } = require("./har/har-exporter");
|
||||
const { NetMonitorController } = require("./netmonitor-controller");
|
||||
const { getLongString } = require("./utils/client");
|
||||
const { L10N } = require("./utils/l10n");
|
||||
const {
|
||||
formDataURI,
|
||||
getFormDataSections,
|
||||
getUrlQuery,
|
||||
parseQueryString,
|
||||
} = require("./utils/request-utils");
|
||||
const {
|
||||
getSelectedRequest,
|
||||
getSortedRequests,
|
||||
} = require("./selectors/index");
|
||||
const { getLongString } = require("./utils/client");
|
||||
const { L10N } = require("./utils/l10n");
|
||||
const {
|
||||
getUrlQuery,
|
||||
parseQueryString,
|
||||
} = require("./utils/request-utils");
|
||||
|
||||
function RequestListContextMenu({
|
||||
cloneSelectedRequest,
|
||||
|
@ -214,7 +212,7 @@ RequestListContextMenu.prototype = {
|
|||
* Copy the request url from the currently selected item.
|
||||
*/
|
||||
copyUrl() {
|
||||
clipboardHelper.copyString(this.selectedRequest.url);
|
||||
copyString(this.selectedRequest.url);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -222,27 +220,19 @@ RequestListContextMenu.prototype = {
|
|||
* selected item.
|
||||
*/
|
||||
copyUrlParams() {
|
||||
let { url } = this.selectedRequest;
|
||||
let params = getUrlQuery(url).split("&");
|
||||
let string = params.join(Services.appinfo.OS === "WINNT" ? "\r\n" : "\n");
|
||||
clipboardHelper.copyString(string);
|
||||
let params = getUrlQuery(this.selectedRequest.url).split("&");
|
||||
copyString(params.join(Services.appinfo.OS === "WINNT" ? "\r\n" : "\n"));
|
||||
},
|
||||
|
||||
/**
|
||||
* Copy the request form data parameters (or raw payload) from
|
||||
* the currently selected item.
|
||||
*/
|
||||
async copyPostData() {
|
||||
let selected = this.selectedRequest;
|
||||
copyPostData() {
|
||||
let { formDataSections, requestPostData } = this.selectedRequest;
|
||||
let params = [];
|
||||
|
||||
// Try to extract any form data parameters.
|
||||
let formDataSections = await getFormDataSections(
|
||||
selected.requestHeaders,
|
||||
selected.requestHeadersFromUploadStream,
|
||||
selected.requestPostData,
|
||||
getLongString);
|
||||
|
||||
let params = [];
|
||||
formDataSections.forEach(section => {
|
||||
let paramsArray = parseQueryString(section);
|
||||
if (paramsArray) {
|
||||
|
@ -256,44 +246,28 @@ RequestListContextMenu.prototype = {
|
|||
|
||||
// Fall back to raw payload.
|
||||
if (!string) {
|
||||
let postData = selected.requestPostData.postData.text;
|
||||
string = await getLongString(postData);
|
||||
string = requestPostData.postData.text;
|
||||
if (Services.appinfo.OS !== "WINNT") {
|
||||
string = string.replace(/\r/g, "");
|
||||
}
|
||||
}
|
||||
|
||||
clipboardHelper.copyString(string);
|
||||
copyString(string);
|
||||
},
|
||||
|
||||
/**
|
||||
* Copy a cURL command from the currently selected item.
|
||||
*/
|
||||
async copyAsCurl() {
|
||||
copyAsCurl() {
|
||||
let selected = this.selectedRequest;
|
||||
|
||||
// Create a sanitized object for the Curl command generator.
|
||||
let data = {
|
||||
url: selected.url,
|
||||
method: selected.method,
|
||||
headers: [],
|
||||
headers: selected.requestHeaders.headers,
|
||||
httpVersion: selected.httpVersion,
|
||||
postDataText: null
|
||||
postDataText: selected.requestPostData && selected.requestPostData.postData.text,
|
||||
};
|
||||
|
||||
// Fetch header values.
|
||||
for (let { name, value } of selected.requestHeaders.headers) {
|
||||
let text = await getLongString(value);
|
||||
data.headers.push({ name: name, value: text });
|
||||
}
|
||||
|
||||
// Fetch the request payload.
|
||||
if (selected.requestPostData) {
|
||||
let postData = selected.requestPostData.postData.text;
|
||||
data.postDataText = await getLongString(postData);
|
||||
}
|
||||
|
||||
clipboardHelper.copyString(Curl.generateCommand(data));
|
||||
copyString(Curl.generateCommand(data));
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -304,7 +278,7 @@ RequestListContextMenu.prototype = {
|
|||
if (Services.appinfo.OS !== "WINNT") {
|
||||
rawHeaders = rawHeaders.replace(/\r/g, "");
|
||||
}
|
||||
clipboardHelper.copyString(rawHeaders);
|
||||
copyString(rawHeaders);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -315,26 +289,21 @@ RequestListContextMenu.prototype = {
|
|||
if (Services.appinfo.OS !== "WINNT") {
|
||||
rawHeaders = rawHeaders.replace(/\r/g, "");
|
||||
}
|
||||
clipboardHelper.copyString(rawHeaders);
|
||||
copyString(rawHeaders);
|
||||
},
|
||||
|
||||
/**
|
||||
* Copy image as data uri.
|
||||
*/
|
||||
copyImageAsDataUri() {
|
||||
const { mimeType, text, encoding } = this.selectedRequest.responseContent.content;
|
||||
|
||||
getLongString(text).then(string => {
|
||||
let data = formDataURI(mimeType, encoding, string);
|
||||
clipboardHelper.copyString(data);
|
||||
});
|
||||
copyString(this.selectedRequest.responseContentDataUri);
|
||||
},
|
||||
|
||||
/**
|
||||
* Save image as.
|
||||
*/
|
||||
saveImageAs() {
|
||||
const { encoding, text } = this.selectedRequest.responseContent.content;
|
||||
let { encoding, text } = this.selectedRequest.responseContent.content;
|
||||
let fileName = this.selectedRequest.urlDetails.baseNameWithQuery;
|
||||
let data;
|
||||
if (encoding === "base64") {
|
||||
|
@ -346,19 +315,14 @@ RequestListContextMenu.prototype = {
|
|||
} else {
|
||||
data = text;
|
||||
}
|
||||
let blob = new Blob([data]);
|
||||
FileSaver.saveAs(blob, fileName, document);
|
||||
saveAs(new Blob([data]), fileName, document);
|
||||
},
|
||||
|
||||
/**
|
||||
* Copy response data as a string.
|
||||
*/
|
||||
copyResponse() {
|
||||
const { text } = this.selectedRequest.responseContent.content;
|
||||
|
||||
getLongString(text).then(string => {
|
||||
clipboardHelper.copyString(string);
|
||||
});
|
||||
copyString(this.selectedRequest.responseContent.content.text);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -372,6 +336,10 @@ RequestListContextMenu.prototype = {
|
|||
* Save HAR from the network panel content to a file.
|
||||
*/
|
||||
saveAllAsHar() {
|
||||
// FIXME: This will not work in launchpad
|
||||
// document.execCommand(‘cut’/‘copy’) was denied because it was not called from
|
||||
// inside a short running user-generated event handler.
|
||||
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Interact_with_the_clipboard
|
||||
return HarExporter.save(this.getDefaultHarOptions());
|
||||
},
|
||||
|
||||
|
|
|
@ -94,6 +94,14 @@ add_task(function* () {
|
|||
}
|
||||
|
||||
function* testCopyPostData(index, postData) {
|
||||
// Wait for formDataSections and requestPostData state are ready in redux store
|
||||
// since copyPostData API needs to read these state.
|
||||
yield waitUntil(() => {
|
||||
let { requests } = gStore.getState().requests;
|
||||
let actIDs = Object.keys(requests.toJS());
|
||||
let { formDataSections, requestPostData } = requests.get(actIDs[index]).toJS();
|
||||
return formDataSections && requestPostData;
|
||||
});
|
||||
EventUtils.sendMouseEvent({ type: "mousedown" },
|
||||
document.querySelectorAll(".request-list-item")[index]);
|
||||
EventUtils.sendMouseEvent({ type: "contextmenu" },
|
||||
|
|
|
@ -62,8 +62,8 @@ let webpackConfig = {
|
|||
"devtools/client/shared/components/tabs/tabs": "devtools-modules/client/shared/components/tabs/tabs",
|
||||
"devtools/client/shared/components/tree/tree-view": "devtools-modules/client/shared/components/tree/tree-view",
|
||||
"devtools/client/shared/components/tree/tree-row": "devtools-modules/client/shared/components/tree/tree-row",
|
||||
"devtools/client/shared/curl": "devtools-modules",
|
||||
"devtools/client/shared/file-saver": "devtools-modules",
|
||||
"devtools/client/shared/curl": "devtools-modules/client/shared/curl",
|
||||
"devtools/client/shared/file-saver": "devtools-modules/client/shared/file-saver",
|
||||
"devtools/client/shared/prefs": "devtools-modules",
|
||||
"devtools/client/shared/vendor/immutable": "immutable",
|
||||
"devtools/client/shared/vendor/react": "react",
|
||||
|
@ -79,7 +79,7 @@ let webpackConfig = {
|
|||
"devtools/shared/fronts/timeline": "devtools-modules",
|
||||
"devtools/shared/l10n": "devtools-modules/shared/l10n",
|
||||
"devtools/shared/locales": path.join(__dirname, "../../shared/locales/en-US"),
|
||||
"devtools/shared/platform/clipboard": "devtools-modules",
|
||||
"devtools/shared/platform/clipboard": "devtools-modules/shared/clipboard",
|
||||
"devtools/shared/plural-form": "devtools-modules",
|
||||
"toolkit/locales": path.join(__dirname, "../../../toolkit/locales/en-US"),
|
||||
"Services": "devtools-modules/client/shared/shim/Services",
|
||||
|
|
Загрузка…
Ссылка в новой задаче