NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name FastMail Auto Save Drafts // @namespace http://patabugen.co.uk/ // @version 0.1 // @description Click on the Save Now button every 5 seconds when editing a draft in FastMail // @author Patabugen // @match https://www.fastmail.com/mail/compose/* // @grant none // ==/UserScript== /** * Fire an event handler to the specified node. Event handlers can detect that the event was fired programatically * by testing for a 'synthetic=true' property on the event object * @param {HTMLNode} node The node to fire the event handler on. * @param {String} eventName The name of the event without the "on" (e.g., "focus") * * Taken from: http://stackoverflow.com/a/2381862 */ function fireEvent(node, eventName) { // Make sure we use the ownerDocument from the provided node to avoid cross-window problems var doc; if (node.ownerDocument) { doc = node.ownerDocument; } else if (node.nodeType == 9){ // the node may be the document itself, nodeType 9 = DOCUMENT_NODE doc = node; } else { throw new Error("Invalid node passed to fireEvent: " + node.id); } if (node.dispatchEvent) { // Gecko-style approach (now the standard) takes more work var eventClass = ""; // Different events have different event classes. // If this switch statement can't map an eventName to an eventClass, // the event firing is going to fail. switch (eventName) { case "click": // Dispatching of 'click' appears to not work correctly in Safari. Use 'mousedown' or 'mouseup' instead. case "mousedown": case "mouseup": eventClass = "MouseEvents"; break; case "focus": case "change": case "blur": case "select": eventClass = "HTMLEvents"; break; default: throw "fireEvent: Couldn't find an event class for event '" + eventName + "'."; break; } var event = doc.createEvent(eventClass); event.initEvent(eventName, true, true); // All events created as bubbling and cancelable. event.synthetic = true; // allow detection of synthetic events // The second parameter says go ahead with the default action node.dispatchEvent(event, true); } else if (node.fireEvent) { // IE-old school style var event = doc.createEventObject(); event.synthetic = true; // allow detection of synthetic events node.fireEvent("on" + eventName, event); } }; (function() { 'use strict'; function auto_save_draft() { var saveDraftButton = document.getElementsByClassName('s-save-draft')[0]; if (saveDraftButton === undefined) { alert("Unable to find Save Draft button - auto save may not be working"); return; } fireEvent(saveDraftButton, 'click'); setTimeout(auto_save_draft, 5000); } // This partly just lets the page load, but there's also no need to save right away. setTimeout(auto_save_draft, 5000); })();