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.
183 lines
6.2 KiB
183 lines
6.2 KiB
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); |
|
}) |
|
} |
|
}
|
|
|