NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name RightToWrite
// @namespace http://gmscript.gentoo.moe
// @include *
// @version 0.1
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
// @downloadURL https://raw.githubusercontent.com/perillamint/RightToWrite/master/RightToWrite.user.js
// @updateURL https://raw.githubusercontent.com/perillamint/RightToWrite/master/RightToWrite.meta.js
// @grant none
// @license GPLv3 or later
// ==/UserScript==
//Prevent compat issue.
this.$ = this.jQuery = jQuery.noConflict(true);
// Configuration object.
var config = {
"makePasswordVisible": false,
"removeReadonlyAttr": true,
"removeDisabledAttr": true,
};
function do_unlock(inputDOM) {
if(config.makePasswordVisible &&
inputDOM.getAttribute("type").toLowerCase() === "password") {
$(inputDOM).attr("type", "text");
console.log("Changed password to text.");
}
if(config.removeReadonlyAttr && inputDOM.getAttribute("readonly") !== null) {
$(inputDOM).removeAttr("readonly");
console.log("Readonly attribute removed.");
}
if(config.removeDisabledAttr && inputDOM.disabled) {
$(inputDOM).prop("disabled", false);
console.log("Disabled attribute removed.");
}
}
function find_all_input(cb) {
$("input").each(function (i, inputDOM) {
cb(inputDOM);
});
}
var obs_config = {
childList: true,
characterData: true,
subtree: true,
attributes: true
};
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if(mutation.type === "attributes") {
//Attributes
if(mutation.target.tagName.toLowerCase() === "input") {
do_unlock(mutation.target);
}
} else {
var added_nodes = mutation.addedNodes;
for (var i = 0; i < added_nodes.length; i++) {
if(added_nodes[i].tagName.toLowerCase() === "input") {
do_unlock(added_nodes[i]);
}
}
}
});
});
observer.observe(document, obs_config);
find_all_input(function (inputDOM) {
do_unlock(inputDOM);
});