You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
6.2 KiB
184 lines
6.2 KiB
6 years ago
|
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
||
|
Cu.import("resource://gre/modules/Services.jsm");
|
||
|
|
||
|
const EXPORTED_SYMBOLS = [];
|
||
|
|
||
|
var gAllowedPasteSites = [];
|
||
|
var gAllowedCutCopySites = [];
|
||
|
var gDeniedPasteSites = [];
|
||
|
var gDeniedCutCopySites = [];
|
||
|
var gDefaultPastePolicy = false;
|
||
|
var gDefaultCutCopyPolicy = false;
|
||
|
|
||
|
function allowCutCopy(doc) {
|
||
|
var win = doc.defaultView;
|
||
|
if (win !== win.top) {
|
||
|
// It's an iframe. Use the top level window
|
||
|
// for security purposes
|
||
|
win = win.top;
|
||
|
}
|
||
|
|
||
|
if (gDefaultCutCopyPolicy == true) {
|
||
|
for (var i=0; i < gDeniedCutCopySites.length; i++) {
|
||
|
if (win.location.href.indexOf(gDeniedCutCopySites[i]) == 0) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
} else {
|
||
|
for (var i=0; i < gAllowedCutCopySites.length; i++) {
|
||
|
if (win.location.href.indexOf(gAllowedCutCopySites[i]) == 0) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function allowPaste(doc) {
|
||
|
var win = doc.defaultView;
|
||
|
if (win !== win.top) {
|
||
|
// It's an iframe. Use the top level window
|
||
|
// for security purposes
|
||
|
win = win.top;
|
||
|
}
|
||
|
|
||
|
if (gDefaultPastePolicy == true) {
|
||
|
for (var i=0; i < gDeniedPasteSites.length; i++) {
|
||
|
if (win.location.href.indexOf(gDeniedPasteSites[i]) == 0) {
|
||
|
return false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
} else {
|
||
|
for (var i=0; i < gAllowedPasteSites.length; i++) {
|
||
|
if (win.location.href.indexOf(gAllowedPasteSites[i]) == 0) {
|
||
|
return true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function myExecCommand(doc, originalExecCommand) {
|
||
|
return function(aCommandName, aShowDefaultUI, aValueArgument) {
|
||
|
switch (aCommandName.toLowerCase()) {
|
||
|
case "cut":
|
||
|
case "copy":
|
||
|
if (allowCutCopy(doc)) {
|
||
|
var win = Services.wm.getMostRecentWindow("navigator:browser");
|
||
|
win.goDoCommand("cmd_" + aCommandName.toLowerCase());
|
||
|
return true;
|
||
|
}
|
||
|
break;
|
||
|
case "paste":
|
||
|
if (allowPaste(doc)) {
|
||
|
var win = Services.wm.getMostRecentWindow("navigator:browser");
|
||
|
win.goDoCommand("cmd_" + aCommandName.toLowerCase());
|
||
|
return true;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return originalExecCommand.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function myQueryCommandSupported(doc, originalQueryCommandSupported) {
|
||
|
return function(aCommandName) {
|
||
|
switch (aCommandName.toLowerCase()) {
|
||
|
case "cut":
|
||
|
case "copy":
|
||
|
if (allowCutCopy(doc)) {
|
||
|
return true;
|
||
|
}
|
||
|
break;
|
||
|
case "paste":
|
||
|
if (allowPaste(doc)) {
|
||
|
return true;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return originalQueryCommandSupported.call(doc, aCommandName, aShowDefaultUI, aValueArgument);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var documentObserver = {
|
||
|
observe: function observe(subject, topic, data) {
|
||
|
if (subject instanceof Ci.nsIDOMWindow && topic == 'content-document-global-created') {
|
||
|
var doc = subject.document;
|
||
|
var cutCopyAllowed = allowCutCopy(doc);
|
||
|
var pasteAllowed = allowPaste(doc);
|
||
|
if (!cutCopyAllowed && !pasteAllowed) {
|
||
|
return;
|
||
|
}
|
||
|
var originalExecCommand = Cu.waiveXrays(doc).execCommand;
|
||
|
Cu.exportFunction(myExecCommand(doc, originalExecCommand), doc, {defineAs: "execCommand"});
|
||
|
var originalQueryCommandSupported = Cu.waiveXrays(doc).queryCommandSupported;
|
||
|
Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandSupported), doc, {defineAs: "queryCommandSupported"});
|
||
|
var originalQueryCommandEnabled = Cu.waiveXrays(doc).queryCommandEnabled;
|
||
|
Cu.exportFunction(myQueryCommandSupported(doc, originalQueryCommandEnabled), doc, {defineAs: "queryCommandEnabled"});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Don't do this check before Firefox 29
|
||
|
if (Services.vc.compare(Services.appinfo.version, "29") > 0) {
|
||
|
try {
|
||
|
if (Services.prefs.getCharPref("capability.policy.default.Clipboard.cutcopy") == "allAccess") {
|
||
|
gDefaultCutCopyPolicy = true;
|
||
|
}
|
||
|
} catch (e) {}
|
||
|
try {
|
||
|
if (Services.prefs.getCharPref("capability.policy.default.Clipboard.paste") == "allAccess") {
|
||
|
gDefaultPastePolicy = true;
|
||
|
}
|
||
|
} catch (e) {}
|
||
|
try {
|
||
|
var policies = [];
|
||
|
policies = Services.prefs.getCharPref("capability.policy.policynames").split(', ');
|
||
|
for (var i=0; i < policies.length; i++ ) {
|
||
|
try {
|
||
|
if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "allAccess") {
|
||
|
var allowedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
|
||
|
for (var j=0; j < allowedCutCopySites.length; j++) {
|
||
|
gAllowedCutCopySites.push(allowedCutCopySites[j]);
|
||
|
}
|
||
|
}
|
||
|
} catch(e) {}
|
||
|
try {
|
||
|
if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.cutcopy") == "noAccess") {
|
||
|
var deniedCutCopySites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
|
||
|
for (var j=0; j < deniedCutCopySites.length; j++) {
|
||
|
gDeniedCutCopySites.push(deniedCutCopySites[j]);
|
||
|
}
|
||
|
}
|
||
|
} catch(e) {}
|
||
|
try {
|
||
|
if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "allAccess") {
|
||
|
var allowedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
|
||
|
for (var j=0; j < allowedPasteSites.length; j++) {
|
||
|
gAllowedPasteSites.push(allowedPasteSites[j]);
|
||
|
}
|
||
|
}
|
||
|
} catch(e) {}
|
||
|
try {
|
||
|
if (Services.prefs.getCharPref("capability.policy." + policies[i] + ".Clipboard.paste") == "noAccess") {
|
||
|
var deniedPasteSites = Services.prefs.getCharPref("capability.policy." + policies[i] + ".sites").split(" ");
|
||
|
for (var j=0; j < deniedPasteSites.length; j++) {
|
||
|
gDeniedPasteSites.push(deniedPasteSites[j]);
|
||
|
}
|
||
|
}
|
||
|
} catch(e) {}
|
||
|
}
|
||
|
} catch (e) {}
|
||
|
if (gDefaultCutCopyPolicy || gDefaultPastePolicy ||
|
||
|
gAllowedCutCopySites.length > 0 || gAllowedPasteSites> 0) {
|
||
|
Services.obs.addObserver(documentObserver, "content-document-global-created", false);
|
||
|
addEventListener("unload", function() {
|
||
|
Services.obs.removeObserver(documentObserver, "content-document-global-created", false);
|
||
|
})
|
||
|
}
|
||
|
}
|