Bug 1355833 - Fix broken context menu actions r=Honza

MozReview-Commit-ID: 4g8kLH5LD97

--HG--
extra : rebase_source : 3eb0843fdc1e1e3d62b03980ce8142ea2c4a67d3
This commit is contained in:
Ricky Chien 2017-04-13 20:48:46 +08:00
Родитель 8f16cb5be3
Коммит db262e9484
4 изменённых файлов: 43 добавлений и 65 удалений

Просмотреть файл

@ -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",