/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const { classes: Cc, interfaces: Ci, utils: Cu } = Components; this.EXPORTED_SYMBOLS = [ ]; Cu.import("resource:///modules/devtools/gcli.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "console", "resource://gre/modules/devtools/Console.jsm"); // We should really be using nsICookieManager so we can read more than just the // key/value of cookies. The difficulty is filtering the cookies that are // relevant to the current page. See // https://github.com/firebug/firebug/blob/master/extension/content/firebug/cookies/cookieObserver.js#L123 // For details on how this is done with Firebug /** * 'cookie' command */ gcli.addCommand({ name: "cookie", description: gcli.lookup("cookieDesc"), manual: gcli.lookup("cookieManual") }); /** * The template for the 'cookie list' command. */ var cookieListHtml = "" + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + "
" + gcli.lookup("cookieListOutKey") + "" + gcli.lookup("cookieListOutValue") + "" + gcli.lookup("cookieListOutActions") + "
${cookie.key}${cookie.value}" + " " + gcli.lookup("cookieListOutEdit") + "" + " " + gcli.lookup("cookieListOutRemove") + "" + "
" + ""; /** * 'cookie list' command */ gcli.addCommand({ name: "cookie list", description: gcli.lookup("cookieListDesc"), manual: gcli.lookup("cookieListManual"), returnType: "string", exec: function Command_cookieList(args, context) { // Parse out an array of { key:..., value:... } objects for each cookie var doc = context.environment.contentDocument; var cookies = doc.cookie.split("; ").map(function(cookieStr) { var equalsPos = cookieStr.indexOf("="); return { key: cookieStr.substring(0, equalsPos), value: cookieStr.substring(equalsPos + 1) }; }); return context.createView({ html: cookieListHtml, data: { cookies: cookies, onclick: createUpdateHandler(context), ondblclick: createExecuteHandler(context), } }); } }); /** * 'cookie remove' command */ gcli.addCommand({ name: "cookie remove", description: gcli.lookup("cookieRemoveDesc"), manual: gcli.lookup("cookieRemoveManual"), params: [ { name: "key", type: "string", description: gcli.lookup("cookieRemoveKeyDesc"), } ], exec: function Command_cookieRemove(args, context) { let document = context.environment.contentDocument; let expDate = new Date(); expDate.setDate(expDate.getDate() - 1); document.cookie = escape(args.key) + "=; expires=" + expDate.toGMTString(); } }); /** * 'cookie set' command */ gcli.addCommand({ name: "cookie set", description: gcli.lookup("cookieSetDesc"), manual: gcli.lookup("cookieSetManual"), params: [ { name: "key", type: "string", description: gcli.lookup("cookieSetKeyDesc") }, { name: "value", type: "string", description: gcli.lookup("cookieSetValueDesc") }, { group: gcli.lookup("cookieSetOptionsDesc"), params: [ { name: "path", type: "string", defaultValue: "/", description: gcli.lookup("cookieSetPathDesc") }, { name: "domain", type: "string", defaultValue: null, description: gcli.lookup("cookieSetDomainDesc") }, { name: "secure", type: "boolean", description: gcli.lookup("cookieSetSecureDesc") } ] } ], exec: function Command_cookieSet(args, context) { let document = context.environment.contentDocument; document.cookie = escape(args.key) + "=" + escape(args.value) + (args.domain ? "; domain=" + args.domain : "") + (args.path ? "; path=" + args.path : "") + (args.secure ? "; secure" : ""); } }); /** * Helper to find the 'data-command' attribute and call some action on it. * @see |updateCommand()| and |executeCommand()| */ function withCommand(element, action) { var command = element.getAttribute("data-command"); if (!command) { command = element.querySelector("*[data-command]") .getAttribute("data-command"); } if (command) { action(command); } else { console.warn("Missing data-command for " + util.findCssSelector(element)); } } /** * Create a handler to update the requisition to contain the text held in the * first matching data-command attribute under the currentTarget of the event. * @param context Either a Requisition or an ExecutionContext or another object * that contains an |update()| function that follows a similar contract. */ function createUpdateHandler(context) { return function(ev) { withCommand(ev.currentTarget, function(command) { context.update(command); }); } } /** * Create a handler to execute the text held in the data-command attribute * under the currentTarget of the event. * @param context Either a Requisition or an ExecutionContext or another object * that contains an |update()| function that follows a similar contract. */ function createExecuteHandler(context) { return function(ev) { withCommand(ev.currentTarget, function(command) { context.exec({ visible: true, typed: command }); }); } }