home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2005 March
/
PCWorld_2005-03_cd.bin
/
komunikace
/
kmeleon
/
kmeleon09.exe
/
flashblock.jar
/
content
/
flashblock
/
flashblock.js
< prev
next >
Wrap
Text File
|
2004-12-07
|
7KB
|
243 lines
/// USER STYLESHEET FUNCTIONS
// File mode flags
const MODE_RDONLY = 0x01;
const MODE_WRONLY = 0x02;
const MODE_RDWR = 0x04;
const MODE_CREATE = 0x08;
const MODE_APPEND = 0x10;
const MODE_TRUNCATE = 0x20;
const MODE_SYNC = 0x40;
const MODE_EXCL = 0x80;
// Returns a nsIFile for the specified file in the profile chrome directory
function getUserChromeFile(fileName)
{
var NSIFILE = Components.interfaces.nsIFile;
var dirLocator = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties);
var userChromePath = dirLocator.get("UChrm", NSIFILE).path;
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(userChromePath);
file.append(fileName);
return file;
}
// Returns the contents of the specified file in the profile chrome directory
function readUserChromeFile(fileName) {
var fileContents = "";
var file = getUserChromeFile(fileName);
if(file.exists()) {
var ioFlags = MODE_RDONLY;
// Get an input stream
var is = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance( Components.interfaces.nsIFileInputStream);
is.init(file, ioFlags, 0, is.CLOSE_ON_EOF);
var sis = Components.classes["@mozilla.org/scriptableinputstream;1"]
.createInstance( Components.interfaces.nsIScriptableInputStream);
sis.init(is);
// Read the file in
while(sis.available() > 0)
fileContents += sis.read(sis.available());
// Close streams
is.close();
sis.close();
}
return fileContents;
}
// Writes the specified contents into the specified file in the profile chrome directory
function writeUserChromeFile(fileName, fileContents) {
var file = getUserChromeFile(fileName);
var ioFlags = MODE_WRONLY | MODE_CREATE | MODE_TRUNCATE;
var perm = 0644;
var os = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance( Components.interfaces.nsIFileOutputStream);
os.init(file, ioFlags, perm, 0);
var result = os.write(fileContents, fileContents.length);
os.close();
return result;
}
// Checks the if the user stylesheet already contains the import statement
function userStyleSheetHasImport() {
var fileContents = readUserChromeFile('userContent.css');
var re = new RegExp("^[ \t]*@import.*chrome://flashblock/content/flashblock.css", "m");
return re.test(fileContents);
}
// Adds a CSS import statement for the flashblock stylesheet
function addImportToUserStylesheet(fileName) {
var importStr = "@import url(chrome://flashblock/content/flashblock.css);"
var fileContents = readUserChromeFile('userContent.css');
var re = new RegExp("^[ \t]*@import.*chrome://flashblock/content/flashblock.css", "m");
if(re.test(fileContents))
return true;
fileContents = importStr + "\n" + fileContents;
var ret = writeUserChromeFile(fileName, fileContents);
return (ret == fileContents.length);
}
// Removes the CSS import statement for the flashblock stylesheet
function removeImportFromUserStylesheet(fileName) {
var fileContents = readUserChromeFile(fileName);
var re = new RegExp("^[ \t]*@import.*chrome://flashblock/content/flashblock.css.*(\n)?$", "mg");
if(re.test(fileContents)) {
fileContents = fileContents.replace(re, '');
var ret = writeUserChromeFile(fileName, fileContents);
return (ret == fileContents.length)
} else {
return true;
}
}
/// PREF FUNCTIONS
var prefObserver = {
observe: function(subject, topic, data) {
if(data == "flashblock.whitelist")
loadWhitelist();
if(data == "flashblock.enabled");
gEnabled = isEnabled();
}
}
function addPrefObserver() {
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var pbi = prefs.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
pbi.addObserver("flashblock.enabled", prefObserver, false);
pbi.addObserver("flashblock.whitelist", prefObserver, false);
}
// Loads the whitelist into the global array
function loadWhitelist() {
gWhitelist = new Array();
pref = getWhitelistPref();
if (pref) {
gWhitelist = pref.split(",");
gWhitelist[gWhitelist.length] = "file://";
}
}
/// WHITELIST FUNCTIONS
function checkWhitelist(url) {
if(url.protocol == "file:")
return true;
for (var i = 0; i < gWhitelist.length; i++) {
// Handle *
var expr = gWhitelist[i];
expr = expr.replace(/\./g, "\\.");
expr = expr.replace(/\-/g, "\\-");
expr = expr.replace(/\*/g, "[A-Za-z0-9_\\-\\.]+")
expr = "^" + expr + "$";
var re = new RegExp(expr);
if(re.test(url.host))
return true;
}
return false;
}
function checkLoadFlash(e) {
if(! gEnabled || checkWhitelist(e.target.location))
e.preventDefault();
e.stopPropagation();
}
/// CONTEXT MENU FUNCTIONS
function contextMenuInit() {
var cm = document.getElementById("contentAreaContextMenu");
cm.addEventListener("popupshowing",flashblockContextMenu,false);
}
function flashblockContextMenu() {
var cm = gContextMenu;
var onFlash = cm.onImage && cm.imageURL.indexOf("chrome://flashblock") == 0;
document.getElementById("context-flashAllow").hidden = !onFlash;
document.getElementById("context-flashWhitelist").hidden = !onFlash;
if(onFlash) {
// XXX HACK: isn't there a better way?
document.getElementById("context-saveimage").hidden = true;
document.getElementById("context-sendimage").hidden = true;
document.getElementById("context-setWallpaper").hidden = true;
document.getElementById("context-viewimage").hidden = true;
document.getElementById("context-blockimage").hidden = true;
document.getElementById("context-copyimage").hidden = true;
document.getElementById("context-sep-copyimage").hidden = true;
document.getElementById("context-sep-properties").hidden = true;
document.getElementById("context-metadata").hidden = true;
try {
document.getElementById("context-copyimage-contents").hidden = true;
} catch(e) {}
}
}
function flashblockOptions() {
window.openDialog("chrome://flashblock/content/options.xul", "FlashblockOptions", "chrome");
}
function addSiteToWhitelist() {
var uri = Components.classes['@mozilla.org/network/standard-url;1']
.createInstance(Components.interfaces.nsIURI);
uri.spec = gContextMenu.target.baseURI;
var prefStr = getWhitelistPref();
if(prefStr)
prefStr += ","
if(prefStr.indexOf(uri.host + ",") == -1)
prefStr += uri.host;
setWhitelistPref(prefStr);
}
/// INITIALIZATION CODE
function onInstall() {
window.removeEventListener("load", onInstall, true);
if(! userStyleSheetHasImport()) {
addImportToUserStylesheet('userContent.css')
alert('Flashblock is now installed.\nPlease restart firefox to activate it.');
}
}
var gWhitelist;
var gEnabled;
addPrefObserver();
loadWhitelist();
gEnabled = isEnabled();
window.addEventListener("load", onInstall, true);
window.addEventListener("flashblockCheckLoad", checkLoadFlash, false)
window.addEventListener("load", contextMenuInit, false);