Import from private repo

Este commit está contenido en:
JustOff
2017-11-09 21:09:01 +02:00
commit a831fb4bda
Se han modificado 33 ficheros con 5004 adiciones y 0 borrados

2
.gitignore vendido Archivo normal
Ver fichero

@@ -0,0 +1,2 @@
*.sqlite
skin/icons/

17
README.md Archivo normal
Ver fichero

@@ -0,0 +1,17 @@
## Classic Add-ons Archive
### About
This catalog contains **75,687** versions of **16,706** Firefox add-ons created by **12,538** developers over the past **14 years** using XUL/XPCOM technology before Mozilla decided to ruin the classic extensions ecosystem and go exclusively to WebExtensions.
### Who creates these add-ons?
The add-ons listed here have been created by a wide range of developers from individual hobbyists to large corporations and were reviewed by a team of AMO editors before being released. Add-ons marked as Experimental have not been reviewed and should be installed with caution.
### The source of data
All the data contained in this catalog was obtained from publicly available sources such as [AMO](https://addons.mozilla.org/), [Wayback Machine](http://web.archive.org/) and other open Internet directories and collections. All download links currently also point to AMO, an independent repository is under way. Any help with hosting the main data storage or mirror is highly welcomed.
### Legal notices
Except as noted below, this catalog is released under [Mozilla Public License, version 2.0](http://www.mozilla.org/MPL/2.0/). The design is based on AMO website by [Mozilla](https://www.mozilla.org/) and adapted by JustOff under [CC-BY-SA-3.0](http://creativecommons.org/licenses/by-sa/3.0/). All product names, logos and brands are property of their respective owners, specific licenses are indicated in the description of each add-on. All company, product and service names used in this catalog are for identification purposes only.

298
bootstrap.js vendido Archivo normal
Ver fichero

@@ -0,0 +1,298 @@
"use strict";
var {classes: Cc, interfaces: Ci, manager: Cm, results: Cr, Constructor: CC, utils: Cu} = Components;
Cm.QueryInterface(Ci.nsIComponentRegistrar);
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
const SCHEME = "caa";
const CAA_URL ="chrome://ca-archive/content/ca-archive.html";
const CAA_URI = Services.io.newURI(CAA_URL, null, null);
const nsIURI = CC("@mozilla.org/network/simple-uri;1", "nsIURI");
let factory, gWindowListener = null, branch = "extensions.ca-archive.";
let styleSheetService = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
let styleSheetURI = Services.io.newURI("chrome://ca-archive/skin/button.css", null, null);
function $(node, childId) {
if (node.getElementById) {
return node.getElementById(childId);
} else {
return node.querySelector("#" + childId);
}
}
let button = {
meta : {
id : "ca-archive-button",
label : "Classic Add-ons Archive",
tooltiptext : "Classic Add-ons Archive",
class : "toolbarbutton-1 chromeclass-toolbar-additional"
},
install : function (w) {
let doc = w.document;
let b = doc.createElement("toolbarbutton");
for (let a in this.meta) {
b.setAttribute(a, this.meta[a]);
}
b.style.listStyleImage = 'url("chrome://ca-archive/skin/button.png")';
let toolbox = $(doc, "navigator-toolbox");
toolbox.palette.appendChild(b);
let {toolbarId, nextItemId} = this.getPrefs(),
toolbar = toolbarId && $(doc, toolbarId),
nextItem = toolbar && $(doc, nextItemId);
if (toolbar) {
if (nextItem && nextItem.parentNode && nextItem.parentNode.id.replace("-customization-target", "") == toolbarId) {
toolbar.insertItem(this.meta.id, nextItem);
} else {
let ids = (toolbar.getAttribute("currentset") || "").split(",");
nextItem = null;
for (let i = ids.indexOf(this.meta.id) + 1; i > 0 && i < ids.length; i++) {
nextItem = $(doc, ids[i])
if (nextItem) {
break;
}
}
toolbar.insertItem(this.meta.id, nextItem);
}
if (toolbar.getAttribute("collapsed") == "true") {
try { w.setToolbarVisibility(toolbar, true); } catch(e) {}
}
}
return b;
},
onCustomize : function(e) {
try {
let ucs = Services.prefs.getCharPref("browser.uiCustomization.state");
if ((/\"nav\-bar\"\:\[.*?\"ca\-archive\-button\".*?\]/).test(ucs)) {
Services.prefs.getBranch(branch).setCharPref("toolbarId", "nav-bar");
} else {
button.setPrefs(null, null);
}
} catch(e) {}
},
afterCustomize : function (e) {
let toolbox = e.target,
b = $(toolbox.parentNode, button.meta.id),
toolbarId, nextItemId;
if (b) {
let parent = b.parentNode,
nextItem = b.nextSibling;
if (parent && (parent.localName == "toolbar" || parent.classList.contains("customization-target"))) {
toolbarId = parent.id;
nextItemId = nextItem && nextItem.id;
}
}
button.setPrefs(toolbarId, nextItemId);
},
getPrefs : function () {
let p = Services.prefs.getBranch(branch);
return {
toolbarId : p.getCharPref("bar"),
nextItemId : p.getCharPref("before")
};
},
setPrefs : function (toolbarId, nextItemId) {
let p = Services.prefs.getBranch(branch);
p.setCharPref("bar", toolbarId == "nav-bar-customization-target" ? "nav-bar" : toolbarId || "");
p.setCharPref("before", nextItemId || "");
}
};
let caaIn = function (w) {
let b = button.install(w);
return {
init : function () {
w.addEventListener("customizationchange", button.onCustomize, false);
w.addEventListener("aftercustomization", button.afterCustomize, false);
b.addEventListener("command", this.run, false);
},
done : function () {
w.removeEventListener("customizationchange", button.onCustomize, false);
w.removeEventListener("aftercustomization", button.afterCustomize, false);
b.removeEventListener("command", this.run, false);
b.parentNode.removeChild(b);
b = null;
},
run : function () {
let isOpen = false;
let winenu = Services.wm.getEnumerator("navigator:browser");
loop: while (winenu.hasMoreElements()) {
let window = winenu.getNext().QueryInterface(Ci.nsIDOMWindow);
for (let tab of window.gBrowser.tabs) {
if (tab.linkedBrowser.currentURI.scheme == "caa") {
window.focus()
window.gBrowser.selectedTab = tab;
isOpen = true;
break loop;
}
}
}
if (!isOpen) {
let mrw = Services.wm.getMostRecentWindow("navigator:browser");
let url = Services.prefs.getBranch(branch).getCharPref("url");
mrw.gBrowser.selectedTab = mrw.gBrowser.addTab(url);
if (url == "caa:about") {
Services.prefs.getBranch(branch).setCharPref("url", "caa:");
}
}
}
};
};
function BrowserWindowObserver(handlers) {
this.handlers = handlers;
}
BrowserWindowObserver.prototype = {
observe: function (aSubject, aTopic, aData) {
if (aTopic == "domwindowopened") {
aSubject.QueryInterface(Ci.nsIDOMWindow).addEventListener("load", this, false);
} else if (aTopic == "domwindowclosed") {
if (aSubject.document.documentElement.getAttribute("windowtype") == "navigator:browser") {
this.handlers.onShutdown(aSubject);
}
}
},
handleEvent: function (aEvent) {
let aWindow = aEvent.currentTarget;
aWindow.removeEventListener(aEvent.type, this, false);
if (aWindow.document.documentElement.getAttribute("windowtype") == "navigator:browser") {
this.handlers.onStartup(aWindow);
}
}
};
function browserWindowStartup (aWindow) {
aWindow["ca-archive"] = caaIn(aWindow);
aWindow["ca-archive"].init()
}
function browserWindowShutdown (aWindow) {
aWindow["ca-archive"].done();
delete aWindow["ca-archive"];
}
function CAAProtocolHandler() {}
CAAProtocolHandler.prototype = Object.freeze({
classDescription: "CAA Protocol Handler",
contractID: "@mozilla.org/network/protocol;1?name=" + SCHEME,
classID: Components.ID('{f0700cf0-b198-11e7-8f1a-0800200c9a66}'),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolHandler]),
scheme: SCHEME,
defaultPort: -1,
allowPort: function(port, scheme) {
return false;
},
protocolFlags: Ci.nsIProtocolHandler.URI_NORELATIVE |
Ci.nsIProtocolHandler.URI_NOAUTH |
Ci.nsIProtocolHandler.URI_DANGEROUS_TO_LOAD |
Ci.nsIProtocolHandler.URI_IS_LOCAL_RESOURCE |
Ci.nsIProtocolHandler.URI_OPENING_EXECUTES_SCRIPT,
newURI: function(aSpec, aOriginCharset, aBaseURI) {
if (aBaseURI && aBaseURI.scheme == SCHEME) {
if (aSpec != "/") {
return Services.io.newURI(aSpec, aOriginCharset, CAA_URI);
} else {
return CAA_URI;
}
}
let rv = new nsIURI();
rv.spec = aSpec;
return rv;
},
newChannel: function(aURI, aSecurity_or_aLoadInfo) {
let channel;
if (Services.vc.compare(Services.appinfo.version, 47) > 0) {
let uri = Services.io.newURI(CAA_URL, null, null);
channel = Services.io.newChannelFromURIWithLoadInfo(uri, aSecurity_or_aLoadInfo);
} else {
channel = Services.io.newChannel(CAA_URL, null, null);
}
channel.originalURI = aURI;
return channel;
}
});
function Factory(component) {
this.createInstance = function(outer, iid) {
if (outer) {
throw Cr.NS_ERROR_NO_AGGREGATION;
}
return new component();
};
this.register = function() {
Cm.registerFactory(component.prototype.classID, component.prototype.classDescription, component.prototype.contractID, this);
};
this.unregister = function() {
Cm.unregisterFactory(component.prototype.classID, this);
};
Object.freeze(this);
this.register();
}
function startup(data, reason) {
if (!styleSheetService.sheetRegistered(styleSheetURI, styleSheetService.USER_SHEET)) {
styleSheetService.loadAndRegisterSheet(styleSheetURI, styleSheetService.USER_SHEET);
}
factory = new Factory(CAAProtocolHandler);
let defaultBranch = Services.prefs.getDefaultBranch(branch);
defaultBranch.setCharPref("bar", "nav-bar");
defaultBranch.setCharPref("before", "");
defaultBranch.setCharPref("url", "caa:about");
gWindowListener = new BrowserWindowObserver({
onStartup: browserWindowStartup,
onShutdown: browserWindowShutdown
});
Services.ww.registerNotification(gWindowListener);
let winenu = Services.wm.getEnumerator("navigator:browser");
while (winenu.hasMoreElements()) {
browserWindowStartup(winenu.getNext());
}
}
function shutdown(data, reason) {
if (reason == APP_SHUTDOWN) return;
Services.ww.unregisterNotification(gWindowListener);
gWindowListener = null;
let winenu = Services.wm.getEnumerator("navigator:browser");
while (winenu.hasMoreElements()) {
browserWindowShutdown(winenu.getNext());
}
factory.unregister();
if (reason == ADDON_UNINSTALL) {
try {
let dir = Services.dirsvc.get("ProfD", Ci.nsIFile); dir.append("ca-archive");
if (dir.exists()) {
dir.remove(true);
}
} catch (e) {}
}
if (styleSheetService.sheetRegistered(styleSheetURI, styleSheetService.USER_SHEET)) {
styleSheetService.unregisterSheet(styleSheetURI, styleSheetService.USER_SHEET);
}
}
function install(data, reason) {}
function uninstall(data, reason) {}

3
chrome.manifest Archivo normal
Ver fichero

@@ -0,0 +1,3 @@
content ca-archive content/
skin ca-archive classic/1.0 skin/

101
content/about.js Archivo normal
Ver fichero

@@ -0,0 +1,101 @@
"use strict";
let EXPORTED_SYMBOLS = ["About"];
let About = {
showPage: function(document, db) {
let data = this.loadData(db);
let template = this.template;
template = this.processTemplate(template, data);
document.title = "About :: Classic Add-ons Archive";
let contfrag = document.createRange().createContextualFragment(template);
let page = document.getElementById("page");
let frag = contfrag.firstElementChild;
page.appendChild(frag);
},
loadData: function(db) {
let data = {};
let dbQuery = db.createStatement("SELECT COUNT(*) AS versions FROM versions");
dbQuery.executeStep();
data.versions = new Intl.NumberFormat("en-US").format(dbQuery.row.versions);
dbQuery.finalize();
dbQuery = db.createStatement("SELECT COUNT(*) AS addons FROM addons");
dbQuery.executeStep();
data.addons = new Intl.NumberFormat("en-US").format(dbQuery.row.addons);
dbQuery.finalize();
dbQuery = db.createStatement("SELECT COUNT(*) AS authors FROM authors");
dbQuery.executeStep();
data.authors = new Intl.NumberFormat("en-US").format(dbQuery.row.authors);
dbQuery.finalize();
return data;
},
processTemplate: function(template, data) {
template = template.replace("%VERSIONS%", data.versions);
template = template.replace("%ADDONS%", data.addons);
template = template.replace("%AUTHORS%", data.authors);
return template;
},
template: `<html>
<body>
<div>
<section class="secondary">
<nav id="side-nav" class="c" data-addontype="1">
<h2>Explore</h2>
<ul id="side-explore">
<li class="s-users"><em><a href="caa:list?sort=users">Most Popular</a></em></li>
<li class="s-rating"><em><a href="caa:list?sort=rating">Top Rated</a></em></li>
</ul>
<h2>Categories</h2>
<ul id="side-categories">
<li id="c-0"><a href="caa:list">All</a></li>
<li id="c-72"><a href="caa:list/alerts-updates">Alerts &amp; Updates</a></li>
<li id="c-14"><a href="caa:list/appearance">Appearance</a></li>
<li id="c-22"><a href="caa:list/bookmarks">Bookmarks</a></li>
<li id="c-5"><a href="caa:list/download-management">Download Management</a></li>
<li id="c-1"><a href="caa:list/feeds-news-blogging">Feeds, News &amp; Blogging</a></li>
<li id="c-142"><a href="caa:list/games-entertainment">Games &amp; Entertainment</a></li>
<li id="c-37"><a href="caa:list/language-support">Language Support</a></li>
<li id="c-38"><a href="caa:list/photos-music-videos">Photos, Music &amp; Videos</a></li>
<li id="c-12"><a href="caa:list/privacy-security">Privacy &amp; Security</a></li>
<li id="c-13"><a href="caa:list/search-tools">Search Tools</a></li>
<li id="c-141"><a href="caa:list/shopping">Shopping</a></li>
<li id="c-71"><a href="caa:list/social-communication">Social &amp; Communication</a></li>
<li id="c-93"><a href="caa:list/tabs">Tabs</a></li>
<li id="c-4"><a href="caa:list/web-development">Web Development</a></li>
<li id="c-73"><a href="caa:list/other">Other</a></li>
</ul>
</nav>
</section>
<section class="primary">
<h1>Classic Add-ons Archive</h1>
<div class="island hero c listing">
<div class="about-home">
<h2>About</h2>
<p>This catalog contains <b>%VERSIONS%</b> versions of <b>%ADDONS%</b> Firefox add-ons created by <b>%AUTHORS%</b> developers over the past <b>14&nbsp;years</b> using XUL/XPCOM technology before Mozilla decided to ruin the classic extensions ecosystem and go exclusively to WebExtensions.</p>
<h2>Who creates these add-ons?</h2>
<p>The add-ons listed here have been created by a wide range of developers from individual hobbyists to large corporations and were reviewed by a team of AMO editors before being released. Add-ons marked as Experimental have not been reviewed and should be installed with caution.</p>
<h2>The source of data</h2>
<p>All the data contained in this catalog was obtained from publicly available sources such as <a target="_blank" href="https://addons.mozilla.org">AMO</a>, <a target="_blank" href="http://web.archive.org/">Wayback Machine</a> and other open Internet directories and collections. All download links currently also point to AMO, an independent repository is under way. Any help with hosting the main data storage or mirror is highly welcomed.</p>
<h2>Legal notices</h2>
<p>Except as noted below, this catalog is released under <a target="_blank" href="http://www.mozilla.org/MPL/2.0/">Mozilla Public License, version 2.0</a>. The design is based on AMO website by <a target="_blank" href="https://www.mozilla.org">Mozilla</a> and adapted by JustOff under <a target="_blank" href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>. All product names, logos and brands are property of their respective owners, specific licenses are indicated in the description of each add-on. All company, product and service names used in this catalog are for identification purposes only. </p>
</div>
</div>
</section>
</div>
</body>
</html>`
};

412
content/addon.js Archivo normal
Ver fichero

@@ -0,0 +1,412 @@
"use strict";
let EXPORTED_SYMBOLS = ["Addon"];
var Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
let Addon = {
showPage: function(document, db, query) {
document.body.className += " gutter addon-details";
let data = this.loadData(db, query);
document.title = data.name + " :: Classic Add-ons Archive";
let template = this.template;
template = this.processTemplate(template, data);
let contfrag = document.createRange().createContextualFragment(template);
let frag = contfrag.firstElementChild;
let page = document.getElementById("page");
page.appendChild(frag);
},
loadData: function(db, query) {
let col;
if (/^\d+$/.test(query)) {
col = "addon_id";
} else {
col = "slug";
}
let data = {};
let dbQuery = db.createStatement("SELECT COUNT(*) as count FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id WHERE addons." + col + " = :query");
dbQuery.params.query = query;
dbQuery.executeStep();
data.count = dbQuery.row.count;
dbQuery.finalize();
dbQuery = db.createStatement("SELECT addons.addon_id AS addon_id, addons.name AS name, slug, is_experimental, users, reviews, rating, summary, description, homepage, dev_comments, support_email, support_url, r1, r2, r3, r4, r5, version, release_notes, is_restart_required, versions.url AS url, min, max, size, created, licenses.name AS lic_name, licenses.url AS lic_url, eulas.rowid AS eula, policies.rowid AS policy, icon FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id LEFT JOIN licenses ON licenses.license_id = versions.license_id LEFT JOIN eulas ON eulas.addon_id = addons.addon_id LEFT JOIN policies ON policies.addon_id = addons.addon_id LEFT JOIN icons ON addons.addon_id = icons.addon_id WHERE addons." + col + " = :query ORDER BY versions.created DESC, versions.version DESC LIMIT 1");
dbQuery.params.query = query;
dbQuery.executeStep();
let id = dbQuery.row.addon_id;
data.reviews = new Intl.NumberFormat("en-US").format(dbQuery.row.reviews);
data.rating = Math.round(dbQuery.row.rating);
data.users = new Intl.NumberFormat("en-US").format(dbQuery.row.users);
if (dbQuery.row.icon) {
data.icon_url = "chrome://ca-archive/skin/icons/" + dbQuery.row.icon + ".png";
} else {
data.icon_url = "chrome://ca-archive/skin/icons/" + Math.trunc(dbQuery.row.addon_id/1000) + "/" + dbQuery.row.addon_id + ".png";
}
data.name = dbQuery.row.name;
data.slug = dbQuery.row.slug;
data.amo = "https://addons.mozilla.org/addon/" + data.slug + "/";
data.wbm = "http://web.archive.org/web/*/https://addons.mozilla.org/en-US/firefox/addon/" + data.slug + "/";
data.summary = dbQuery.row.summary.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;");
if (dbQuery.row.homepage) {
data.homepage = '<li><a class="home" href="' + dbQuery.row.homepage + '">Add-on home page</a></li>';
} else {
data.homepage = "";
}
if (dbQuery.row.support_url) {
data.support_url = '<li><a class="support" href="' + dbQuery.row.support_url + '">Support site</a></li>';
} else {
data.support_url = "";
}
let experiment = "", warning = "";
if (dbQuery.row.is_experimental) {
experiment = 'caution';
warning = '<p class="warning">This add-on has been preliminarily reviewed or marked as experimental by its developers.</p>';
}
data.experiment = experiment;
data.warning = warning;
if (dbQuery.row.support_email) {
data.support_email = '<li><a class="email" href="mailto:' + dbQuery.row.support_email + '">Support E-mail</a></li>';
} else {
data.support_email = "";
}
data.description = dbQuery.row.description.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;");
if (data.description == "") {
data.description = data.summary;
}
if (dbQuery.row.dev_comments != "") {
data.dev_comments = this.devcomm.replace("%DEVCOMM%", dbQuery.row.dev_comments.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;"));
} else {
data.dev_comments = "";
}
data.version = dbQuery.row.version;
data.release_notes = dbQuery.row.release_notes.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;");
data.restart = "";
if (dbQuery.row.is_restart_required == false) {
data.restart = '&nbsp;<span class="no-restart">No Restart</span>';
}
data.min = dbQuery.row.min;
data.max = dbQuery.row.max;
let appver;
if (Services.appinfo.name == "Pale Moon") {
appver = "27.9";
} else {
appver = Services.appinfo.version;
}
if (Services.vc.compare(dbQuery.row.min, appver) <= 0 && Services.vc.compare(appver, dbQuery.row.max) <= 0) {
data.compat = "add";
data.action = "Install Now";
data.downurl = "https://addons.mozilla.org/firefox/downloads/file/" + dbQuery.row.url;
} else {
data.compat = "download";
data.action = "Download";
data.downurl = "https://addons.mozilla.org/firefox/downloads/file/" + dbQuery.row.url.replace("/", "/type:attachment/");
}
let created = new Date(dbQuery.row.created*1000);
data.created = created.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
let nBytes = dbQuery.row.size;
for (let aMultiples = ["KiB", "MiB", "GiB"], nMultiple = 0, nApprox = nBytes / 1024;
nApprox > 1; nApprox /= 1024, nMultiple++) {
data.size = nApprox.toFixed(1) + " " + aMultiples[nMultiple];
};
if (dbQuery.row.lic_url !== null) {
let lic_url, target;
if (dbQuery.row.lic_url != "") {
lic_url = dbQuery.row.lic_url;
target = 'target="_blank"';
} else {
lic_url = "caa:addon/" + data.slug + "/license/" + data.version;
target = '';
}
data.license = '<li class="source-license">Released under <a ' + target + ' href="' + lic_url + '">' + dbQuery.row.lic_name + '</a></li>';
} else {
data.license = "";
}
if (dbQuery.row.eula) {
data.eula = '<a class="eula badge" href="caa:addon/' + data.slug + '/eula">End-User License Agreement</a>';
} else {
data.eula = "";
}
if (dbQuery.row.policy) {
data.policy = '<a class="privacy-policy badge" href="caa:addon/' + data.slug + '/privacy">Privacy Policy</a>';
} else {
data.policy = "";
}
let grating = dbQuery.row.r1 + dbQuery.row.r2 + dbQuery.row.r3 + dbQuery.row.r4 + dbQuery.row.r5;
if (grating > 0) {
let item = this.grating;
item = item.replace("%R1%", dbQuery.row.r1);
item = item.replace("%R2%", dbQuery.row.r2);
item = item.replace("%R3%", dbQuery.row.r3);
item = item.replace("%R4%", dbQuery.row.r4);
item = item.replace("%R5%", dbQuery.row.r5);
item = item.replace("%R1P%", Math.round(dbQuery.row.r1/grating*100));
item = item.replace("%R2P%", Math.round(dbQuery.row.r2/grating*100));
item = item.replace("%R3P%", Math.round(dbQuery.row.r3/grating*100));
item = item.replace("%R4P%", Math.round(dbQuery.row.r4/grating*100));
item = item.replace("%R5P%", Math.round(dbQuery.row.r5/grating*100));
data.grating = item;
} else {
data.grating = "";
}
dbQuery.finalize();
dbQuery = db.createStatement("SELECT tag_name FROM tags WHERE addon_id = :addon_id ORDER BY tag_name");
dbQuery.params.addon_id = id;
let tags = [];
while (dbQuery.executeStep()) {
tags.push(dbQuery.row.tag_name);
}
if (tags.length > 0) {
data.tags = '<div class="clearboth"><h3 class="compact-bottom">Tags</h3><div id="tagbox"><ul class="addon-tags nojs">';
for (let tag of tags) {
data.tags += '<li class="tag"><a href="caa:list?tag=' + tag + '" class="tagitem"> ' + tag + ' </a></li>';
}
data.tags += "</ul></div></div>";
} else {
data.tags = "";
}
dbQuery.finalize();
dbQuery = db.createStatement("SELECT cat_name FROM categories WHERE addon_id = :addon_id ORDER BY cat_name");
dbQuery.params.addon_id = id;
let categories = [];
while (dbQuery.executeStep()) {
categories.push(dbQuery.row.cat_name);
}
if (categories.length > 0) {
let cat_names = { "alerts-updates": "Alerts &amp; Updates", "appearance": "Appearance", "bookmarks": "Bookmarks", "download-management": "Download Management", "feeds-news-blogging": "Feeds, News &amp; Blogging", "games-entertainment": "Games &amp; Entertainment", "language-support": "Language Support", "photos-music-videos": "Photos, Music &amp; Videos", "privacy-security": "Privacy &amp; Security", "search-tools": "Search Tools", "shopping": "Shopping", "social-communication": "Social &amp; Communication", "tabs": "Tabs", "web-development": "Web Development", "other": "Other"};
data.categories = "<h3>Related Categories</h3><ul>";
for (let category of categories) {
data.categories += '<li><a href="caa:list/category' + category + '">' + cat_names[category] + '</a></li>';
}
data.categories += "</ul>";
} else {
data.categories = "";
}
dbQuery.finalize();
dbQuery = db.createStatement("SELECT name, slug FROM authors_addons INNER JOIN authors ON authors_addons.author_id = authors.author_id WHERE addon_id = :addon_id ORDER BY name");
dbQuery.params.addon_id = id;
data.authors = '<h4 class="author">by ';
while (dbQuery.executeStep()) {
data.authors += '<a target="_blank" href="https://addons.mozilla.org/en-US/firefox/user/' + dbQuery.row.slug + '/" title="' + dbQuery.row.name + '">' + dbQuery.row.name + '</a>, ';
}
data.authors = data.authors.slice(0, -2);
data.authors += '</h4>';
dbQuery.finalize();
return data;
},
processTemplate: function(template, data) {
template = template.replace("%REVIEWS%", data.reviews);
template = template.replace("%GRATING%", data.grating);
template = template.replace(/%RATING%/g, data.rating);
template = template.replace("%USERS%", data.users);
template = template.replace("%ICON%", data.icon_url);
template = template.replace(/%NAME%/g, data.name);
template = template.replace(/%SLUG%/g, data.slug);
template = template.replace(/%VERSION%/g, data.version);
template = template.replace("%RESTART%", data.restart);
template = template.replace("%AUTHORS%", data.authors);
template = template.replace("%SUMMARY%", data.summary);
template = template.replace("%EXPERIMENT%", data.experiment);
template = template.replace("%COMPAT%", data.compat);
template = template.replace("%ACTION%", data.action);
template = template.replace("%WARNING%", data.warning);
template = template.replace("%DOWNURL%", data.downurl);
template = template.replace("%PRIVACY%", data.policy);
template = template.replace("%EULA%", data.eula);
template = template.replace("%HOME%", data.homepage);
template = template.replace("%SUPPORT%", data.support_url);
template = template.replace("%EMAIL%", data.support_email);
template = template.replace("%LICENSE%", data.license);
template = template.replace("%ABOUT%", data.description);
template = template.replace(/%RELDATE%/g, data.created);
template = template.replace("%SIZE%", data.size);
template = template.replace(/%COMPATV%/g, "Firefox " + data.min + " - " + data.max);
template = template.replace("%RELNOTE%", data.release_notes);
template = template.replace("%DEVCOMM%", data.dev_comments);
template = template.replace("%CATEGORIES%", data.categories);
template = template.replace("%TAGS%", data.tags);
template = template.replace(/%COUNT%/g, data.count);
template = template.replace(/%AMO%/g, data.amo);
template = template.replace(/%WBM%/g, data.wbm);
return template;
},
template: `<html>
<body>
<div itemscope="" itemtype="http://schema.org/WebApplication">
<aside class="secondary addon-vitals">
<div itemprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating">
<span class="stars large stars-%RATING%" title="Rated %RATING% out of 5 stars">Rated %RATING% out of 5 stars</span>
<div>
<span itemprop="ratingCount">%REVIEWS%</span> user reviews
</div>
</div>
%GRATING%
<div id="daily-users">
%USERS% users
</div>
</aside>
<section class="primary" id="addon-description-header">
<div id="addon" class="island c" role="main" data-id="1865">
<hgroup>
<a target="_blank" href=%AMO% title="Open on AMO"><img class="amologo" src="chrome://ca-archive/skin/amo2k17.png"></a>
<a target="_blank" href=%WBM% title="Open on Wayback Machine"><img class="wbmlogo" src="chrome://ca-archive/skin/logo_archive-sm.png"></a>
<img id="addon-icon" itemprop="image" src="%ICON%" class="icon" alt="Icon of %NAME%">
<h1 class="addon">
<span itemprop="name">%NAME%</span>
<span class="version-number" itemprop="version">%VERSION%</span>
%RESTART%
</h1>
%AUTHORS%
</hgroup>
<p id="addon-summary" itemprop="description">%SUMMARY%</p>
<div class="install-wrapper featuredaddon">
<div class="install-shell">
<div class="install">
<p class="install-button">
<a class="button prominent %EXPERIMENT% %COMPAT%" href="%DOWNURL%">
<span>%ACTION%</span>
</a>
</p>
</div>
%PRIVACY%
%EULA%
<div class="d2c-reasons-popup popup">
<p>This add-on is not compatible with your version of Firefox because of the following:</p>
<ul></ul>
</div>
<div class="head-vercompat">
<span class="head-right"><a href="caa:addon/%SLUG%/versions">View all %COUNT% versions</a></span>
<span class="head-left">Works with %COMPATV%</span>
<p class="head-center">Released on %RELDATE%</p>
</div>
<p><a id="downloadAnyway" hidden="true">Download Anyway</a></p>
</div>
%WARNING%
</div>
</div>
</section>
<aside class="secondary metadata c">
<ul class="links">
%HOME%
%SUPPORT%
%EMAIL%
</ul>
<ul>
%LICENSE%
</ul>
</aside>
<section class="primary island c">
<h2>About this Add-on</h2>
<div class="prose">
<div id="addon-description" class="prose">%ABOUT%
</div>
</div>
</section>
<aside class="secondary metadata c">
%CATEGORIES%
%TAGS%
</aside>
<section class="primary island more-island">
%DEVCOMM%
<section id="detail-relnotes" class="expando">
<h2>Version Information<a class="toggle" href="#detail-relnotes"><b></b></a></h2>
<div class="content listing">
<div class="items">
<div class="version item" id="version-%VERSION%">
<div class="info">
<h3>
<a href="caa:addon/%SLUG%/versions/2.7.2" title="Permanent link to this version">Version %VERSION%</a>
<span class="meta">
<time>Released %RELDATE%</time>
<span class="filesize">%SIZE%</span>
</span>
<span class="meta compat">Works with %COMPATV%</span>
</h3>
<div class="desc prose">%RELNOTE%
</div>
</div>
</div>
</div>
<p class="more c">
<a class="more-info" href="caa:addon/%SLUG%/versions">View all %COUNT% versions</a>
</p>
</div>
</section>
</section>
</div>
</body>
</html>`,
grating: `
<div>
<ul class="grouped_ratings">
<li class="c"> <span class="stars stars-5" title="Rated 5 out of 5 stars">Rated 5 out of 5 stars</span>
<div class="rating_bar">
<span class="bar" style="width:%R5P%%"><span class="num_ratings">%R5%</span></span>
</div>
</li>
<li class="c"> <span class="stars stars-4" title="Rated 4 out of 5 stars">Rated 4 out of 5 stars</span>
<div class="rating_bar">
<span class="bar" style="width:%R4P%%"><span class="num_ratings">%R4%</span></span>
</div>
</li>
<li class="c"> <span class="stars stars-3" title="Rated 3 out of 5 stars">Rated 3 out of 5 stars</span>
<div class="rating_bar">
<span class="bar" style="width:%R3P%%"><span class="num_ratings">%R3%</span></span>
</div>
</li>
<li class="c"> <span class="stars stars-2" title="Rated 2 out of 5 stars">Rated 2 out of 5 stars</span>
<div class="rating_bar">
<span class="bar" style="width:%R2P%%"><span class="num_ratings">%R2%</span></span>
</div>
</li>
<li class="c"> <span class="stars stars-1" title="Rated 1 out of 5 stars">Rated 1 out of 5 stars</span>
<div class="rating_bar">
<span class="bar" style="width:%R1P%%"><span class="num_ratings">%R1%</span></span>
</div>
</li>
</ul>
</div>`,
devcomm: `
<section class="expando" id="developer-comments">
<h2>Developer’s Comments<a class="toggle" href="#developer-comments"><b></b></a></h2>
<div class="content prose">
<p>%DEVCOMM%</p>
</div>
</section>`
};

89
content/ca-archive.html Archivo normal
Ver fichero

@@ -0,0 +1,89 @@
<!DOCTYPE html>
<html dir="ltr" lang="en-US">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<link rel="shortcut icon" type="image/x-icon" href="chrome://ca-archive/skin/logo.png">
<link rel="stylesheet" href="chrome://ca-archive/skin/ca-archive.css">
<title>Classic Add-ons Archive</title>
</head>
<body class="html-ltr firefox moz-header-slim is-impala">
<div id="main-wrapper">
<div id="page" class="c">
<div class="amo-header">
<div class="header-search" role="search">
<form id="search" action="caa:list">
<input id="search-q" name="q" autocomplete="off" title="" class="text placeholder" placeholder="search for add-ons" type="text">
<button class="search-button" type="submit" title="Search" src="chrome://ca-archive/skin/btn-search.png"></button>
</form>
</div>
<div id="masthead">
<h1 class="site-title">
<a href="caa:">
<img alt="Firefox" src="chrome://ca-archive/skin/logo.png">Classic Add-ons Archive <font size="1">(2017.10)</font></a>
</h1>
<nav id="site-nav" class="menu-nav c">
<ul>
<li id="extensions">
<a href="caa:list">Categories</a>
<ul class="two-col">
<li><a href="caa:list/alerts-updates">Alerts &amp; Updates</a></li>
<li><a href="caa:list/appearance">Appearance</a></li>
<li><a href="caa:list/bookmarks">Bookmarks</a></li>
<li><a href="caa:list/download-management">Download Management</a></li>
<li><a href="caa:list/feeds-news-blogging">Feeds, News &amp; Blogging</a></li>
<li><a href="caa:list/games-entertainment">Games &amp; Entertainment</a></li>
<li><a href="caa:list/language-support">Language Support</a></li>
<li><a href="caa:list/photos-music-videos">Photos, Music &amp; Videos</a></li>
<li><a href="caa:list/privacy-security">Privacy &amp; Security</a></li>
<li><a href="caa:list/search-tools">Search Tools</a></li>
<li><a href="caa:list/shopping">Shopping</a></li>
<li><a href="caa:list/social-communication">Social &amp; Communication</a></li>
<li><a href="caa:list/tabs">Tabs</a></li>
<li><a href="caa:list/web-development">Web Development</a></li>
<li><a href="caa:list/other">Other</a></li>
</ul>
</li>
<li id="listby">
<a href="caa:list">List by</a>
<ul>
<li><a href="caa:list?sort=users">Most Users</a></li>
<li><a href="caa:list?sort=rating">Top Rated</a></li>
<li><a href="caa:list?sort=reviews">Most Reviews</a></li>
<li><a href="caa:list?sort=created">Newest</a></li>
<li><a href="caa:list?sort=updated">Recently Updated</a></li>
<li><a href="caa:list?sort=name">Name </a></li>
</ul>
</li>
<li id="more">
<a href="caa:">More…</a>
<ul>
<li><a target="_blank" href="https://addons.mozilla.org/en-US/firefox/">Live Firefox Add-ons Site</a></li>
<li><a target="_blank" href="http://web.archive.org/web/*/https://addons.mozilla.org/en-US/firefox/">Wayback Machine</a></li>
<li><a href="caa:about">About</a></li>
</ul>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div id="tooltip">
<span></span>
</div>
</div>
<script src="chrome://ca-archive/content/ca-archive.js"></script>
</body>
</html>

51
content/ca-archive.js Archivo normal
Ver fichero

@@ -0,0 +1,51 @@
"use strict";
(function () {
var Cu = Components.utils;
let dbname = "ca-archive-17110901.sqlite"; let ver = "17110901";
Cu.import("chrome://ca-archive/content/db.js" + "?" + ver);
if (!DB.openDB(dbname, document)) {
return;
}
/*
caa:addon/{slug|id}/versions[?page=[#ver]]
caa:addon/{slug|id}/{eula|privacy|license/lid}
caa:addon/{slug|id}
caa:list[/category][?{tag|q}=][?sort=][?page=]
caa:[search-query]
*/
try {
let params, url = decodeURI(document.location);
if ((params = /^caa:addon\/(.+?)\/versions\/?(\?page=(\d+)(#.+)?)?$/.exec(url)) !== null) {
Cu.import("chrome://ca-archive/content/versions.js" + "?" + ver);
Versions.showPage(document, DB.db, params[1], params[3]);
} else if ((params = /^caa:addon\/(.+?)\/(eula|privacy|license\/(.+))$/.exec(url)) !== null) {
Cu.import("chrome://ca-archive/content/epl.js" + "?" + ver);
EPL.showPage(document, DB.db, params[1], params[2], params[3]);
} else if ((params = /^caa:addon\/(.+?)\/?$/.exec(url)) !== null) {
Cu.import("chrome://ca-archive/content/addon.js" + "?" + ver);
Addon.showPage(document, DB.db, params[1]);
} else if ((params = /^caa:list(\/([a-z-]+))?(\?tag=(.+?)|\?q=(.+?))?([\?|\&]sort=(\w+))?\&?(page=(\d+))?$/.exec(url)) !== null) {
Cu.import("chrome://ca-archive/content/list.js" + "?" + ver);
List.showPage(document, DB.db, params[2], params[4], params[5], params[7], params[9]);
} else if (url == "caa:") {
Cu.import("chrome://ca-archive/content/tcloud.js" + "?" + ver);
TCloud.showPage(document, DB.db);
} else if (url == "caa:about") {
Cu.import("chrome://ca-archive/content/about.js" + "?" + ver);
About.showPage(document, DB.db);
} else if ((params = /^caa:(.+)$/.exec(url)) !== null) {
Cu.import("chrome://ca-archive/content/list.js" + "?" + ver);
List.showPage(document, DB.db, undefined, undefined, params[1], undefined, undefined);
} else {
document.location = "caa:list";
}
} catch (e) {
Cu.reportError(e);
}
DB.closeDB();
})();

84
content/db.js Archivo normal
Ver fichero

@@ -0,0 +1,84 @@
"use strict";
let EXPORTED_SYMBOLS = ["DB"];
var Cc = Components.classes, Ci = Components.interfaces, Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
function copyDataURLToFile(document, url, file, callback) {
NetUtil.asyncFetch(url, function(istream) {
let ostream = Cc["@mozilla.org/network/file-output-stream;1"].
createInstance(Ci.nsIFileOutputStream);
ostream.init(file, -1, -1, Ci.nsIFileOutputStream.DEFER_OPEN);
NetUtil.asyncCopy(istream, ostream, function(result) {
callback && callback(file, result, document);
});
});
}
function showMessage(document, msg, style) {
let div = document.createElement("div");
div.className = style;
div.appendChild(document.createTextNode(msg));
let page = document.getElementById("page");
page.appendChild(div);
}
let DB = {
db: null,
openDB: function(dbname, document) {
let dir = Services.dirsvc.get("ProfD", Ci.nsIFile); dir.append("ca-archive");
try {
let storageService = Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
let dbFile = dir.clone(); dbFile.append(dbname);
if (dbFile.exists() && dbFile.fileSize > 0) {
this.db = storageService.openDatabase(dbFile);
} else {
if (!dir.exists()) {
showMessage(document, "Performing initial database provisioning ...", "db-warning ok");
throw "Init";
} else {
throw "CA Archive database has jast been updated, not ready or corrupted!";
}
}
return true;
} catch (e) {
if (e != "Init") {
Cu.reportError(e);
showMessage(document, e, "db-warning");
showMessage(document, "Trying to (re)provision database, please wait ...", "db-warning");
}
let tmpFile = FileUtils.getFile("TmpD", ["ca-archive.tmp"]);
tmpFile.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE);
let src = Services.io.newURI("chrome://ca-archive/content/db/" + dbname, null, null);
copyDataURLToFile(document, src, tmpFile, function(file, result, document) {
try {
if (result == 0 && file.exists()) {
if (dir.exists()) {
dir.remove(true);
}
dir.create(1, FileUtils.PERMS_FILE);
tmpFile.moveTo(dir, dbname);
showMessage(document, "Database has been processed successfully!", "db-warning ok");
showMessage(document, "Please reload the page.", "db-warning ok");
} else {
throw "CA Archive database Fatal Error!";
}
} catch (e) {
Cu.reportError(e);
showMessage(document, e, "db-warning bad");
showMessage(document, "Try to reinstall CA Archive.", "db-warning bad");
}
});
return false;
}
},
closeDB: function() {
this.db.close();
}
};

86
content/epl.js Archivo normal
Ver fichero

@@ -0,0 +1,86 @@
"use strict";
let EXPORTED_SYMBOLS = ["EPL"];
let EPL = {
showPage: function(document, db, query, type, ver) {
let data = this.loadData(db, query, type, ver);
let template = this.template;
template = this.processTemplate(template, data);
document.title = data.type + " for " + data.name + " :: Classic Add-ons Archive";
let contfrag = document.createRange().createContextualFragment(template);
let page = document.getElementById("page");
let frag = contfrag.firstElementChild;
page.appendChild(frag);
},
loadData: function(db, query, type, ver) {
let col;
if (/^\d+$/.test(query)) {
col = "addon_id";
} else {
col = "slug";
}
let dbQuery;
if (type == "eula") {
dbQuery = db.createStatement("SELECT addons.name AS name, slug, eulas.text AS eula FROM addons LEFT JOIN eulas ON eulas.addon_id = addons.addon_id WHERE addons." + col + " = :query");
} else if (type == "privacy") {
dbQuery = db.createStatement("SELECT addons.name AS name, slug, policies.text AS policy FROM addons LEFT JOIN policies ON policies.addon_id = addons.addon_id WHERE addons." + col + " = :query");
} else {
dbQuery = db.createStatement("SELECT addons.name AS name, slug, version, licenses.name AS lic_name, licenses.text AS lic_text FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id LEFT JOIN licenses ON licenses.license_id = versions.license_id WHERE addons." + col + " = :query AND versions.version = :version LIMIT 1");
dbQuery.params.version = ver;
}
dbQuery.params.query = query;
let data = {};
dbQuery.executeStep();
data.name = dbQuery.row.name;
data.slug = dbQuery.row.slug;
if (type == "eula") {
data.content = dbQuery.row.eula.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;");
data.type = "End-User License Agreement";
data.version = ""; data.licname = "";
} else if (type == "privacy") {
data.content = dbQuery.row.policy.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;");
data.type = "Privacy Policy";
data.version = ""; data.licname = "";
} else {
data.content = dbQuery.row.lic_text.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;");
data.version = '<span class="version">' + dbQuery.row.version + '</span>';
data.type = "Source Code License";
data.licname = "<h3>" + dbQuery.row.lic_name + "</h3>";
}
dbQuery.finalize();
return data;
},
processTemplate: function(template, data) {
template = template.replace(/%NAME%/g, data.name);
template = template.replace("%VERSION%", data.version);
template = template.replace("%TYPE%", data.type);
template = template.replace("%LICNAME%", data.licname);
template = template.replace("%SLUG%", data.slug);
template = template.replace("%CONTENT%", data.content);
return template;
},
template: `<html>
<body>
<section class="primary2">
<hgroup class="hero">
<h1>%NAME% %VERSION%</h1>
</hgroup>
<div class="prose">
<h2>%TYPE%</h2>
%LICNAME%
<div class="policy-statement">%CONTENT%</div>
<p class="policy-back"><a href="caa:addon/%SLUG%">Back to %NAME%&hellip;</a></p>
</div>
</section>
</body>
</html>`
};

329
content/list.js Archivo normal
Ver fichero

@@ -0,0 +1,329 @@
"use strict";
let EXPORTED_SYMBOLS = ["List"];
var Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
let List = {
showPage: function(document, db, cat, tag, search, sort, page) {
let cats = {"alerts-updates": 0, "appearance": 1, "bookmarks": 2, "download-management": 3, "feeds-news-blogging": 4, "games-entertainment": 5, "language-support":6 , "photos-music-videos": 7, "privacy-security": 8, "search-tools": 9, "shopping": 10, "social-communication": 11, "tabs": 12, "web-development": 13, "other": 14};
let catnames = ["Alerts & Updates", "Appearance", "Bookmarks", "Download Management", "Feeds, News & Blogging", "Games & Entertainment", "Language Support", "Photos, Music & Videos", "Privacy & Security", "Search Tools", "Shopping", "Social & Communication", "Tabs", "Web Development", "Other"];
let catstyle = ["72", "14", "22", "5", "1", "142", "37", "38", "12", "13", "141", "71", "93", "4", "73"];
if (cat === undefined || !(cat in cats)) {
cat = "";
}
if (tag === undefined) {
tag = "";
}
if (search === undefined || search == "list?q=") {
search = "";
} else {
search = search.replace(/\+/g, " ")
document.getElementById("search-q").value = search;
}
let sorts = {"users": 0, "rating": 1, "reviews": 2, "created": 3, "updated": 4, "name": 5};
let sortnames = ["Most Popular Extensions", "Top-Rated Extensions", "Most Reviewed Extensions", "Newest Extensions", "Recently Updated Extensions", "Extensions by Name"];
if (sort === undefined || !(sort in sorts)) {
sort = "users";
}
if (page === undefined) {
page = 1;
}
document.body.className += " extensions s-" + sort;
if (cat != "") {
let css = '#c-%N% a{background:#ecf5fe;color:#333;font-weight:bold;}#c-%N% a:after{color:inherit;}#c-0{display:block}';
css = css.replace(/%N%/g, catstyle[cats[cat]]);
let style = document.createElement('style'); style.type = 'text/css';
style.appendChild(document.createTextNode(css));
document.head.appendChild(style);
}
let data = this.loadData(db, cat, tag, search, sort, page);
data.cat = (cat == "") ? "" : "/" + cat;
data.sort = sort;
let title;
if (tag == "") {
if (search == "") {
if (cat == "") {
data.sortname = sortnames[sorts[sort]];
} else {
data.sortname = catnames[cats[cat]];
}
title = data.sortname;
} else {
data.sortname = 'Search Results for "' + search + '"';
title = search + " :: Search";
}
} else {
data.sortname = 'Search Results for tag "' + tag + '"';
title = tag + " :: Tag";;
}
data.tag = (tag == "") ? (search == "") ? "" : "q=" + search + "&" : "tag=" + tag + "&";
if (sort == "" || sort == "users") {
data.tagc = (tag == "") ? (search == "") ? "" : "?q=" + search : "?tag=" + tag;
} else {
data.tagc = (tag == "") ? (search == "") ? "?sort=" + sort : "?q=" + search + "&sort=" + sort : "?tag=" + tag + "&sort=" + sort;
}
data.srt = ["", "", "", "", "", ""];
data.srt[sorts[sort]] = 'class="selected"';
document.title = title + " :: Classic Add-ons Archive";
let template = this.template;
template = this.processTemplate(template, data);
let contfrag = document.createRange().createContextualFragment(template);
let pagediv = document.getElementById("page");
let frag = contfrag.firstElementChild;
pagediv.appendChild(frag.children[0]);
pagediv.appendChild(frag.children[0]);
},
loadData: function(db, cat, tag, search, sort, page) {
let cq1, cq2;
if (cat != "") {
cq1 = "INNER JOIN categories ON addons.addon_id = categories.addon_id ";
cq2 = "cat_name = '" + cat + "' AND ";
} else {
cq1 = ""; cq2 = "1 AND ";
}
if (tag != "") {
cq1 += "INNER JOIN tags ON addons.addon_id = tags.addon_id ";
cq2 += "tag_name = '" + tag + "' AND ";
} else {
cq1 += ""; cq2 += "1 AND ";
}
if (search != "") {
cq1 += "";
cq2 += "addons.name LIKE '%" + search + "%' AND ";
} else {
cq1 += ""; cq2 += "1 AND ";
}
let cq = cq1 + "WHERE " + cq2.slice(0, -5);
let dbQuery = db.createStatement("SELECT COUNT(*) AS count FROM addons " + cq);
dbQuery.executeStep();
let count = dbQuery.row.count;
dbQuery.finalize();
let data = {};
data.page = count > 0 ? page : 0;
data.count = new Intl.NumberFormat("en-US").format(count);
data.pages = Math.ceil(count / 20);
let pfrom = count > 0 ? (page - 1) * 20 + 1 : 0;
data.pfrom = new Intl.NumberFormat("en-US").format(pfrom);
let pto = (pfrom + 19 < count) ? pfrom + 19 : count;
data.pto = new Intl.NumberFormat("en-US").format(pto);
if (page == 1) {
data.disprev = "disabled";
data.prev = "";
} else {
data.disprev = "";
data.prev = parseInt(page) - 1;
}
if (page == data.pages || count == 0) {
data.disnext = "disabled";
data.next = "";
} else {
data.disnext = "";
data.next = parseInt(page) + 1;
}
let order;
switch (sort) {
case "users": order = "users DESC, addons.addon_id"; break;
case "reviews": order = "reviews DESC, addons.addon_id"; break;
case "rating": order = "bayesian DESC, addons.addon_id"; break;
case "created": order = "addons.addon_id DESC"; break;
case "updated": order = "created DESC, addons.addon_id"; break;
case "name": order = "name"; break;
}
dbQuery = db.createStatement("SELECT addons.addon_id AS addon_id, addons.name AS name, slug, summary, is_experimental, users, reviews, rating, version, is_restart_required, versions.url AS url, min, max, created, icon FROM ( SELECT addons.rowid AS add_row, versions.rowid AS ver_row, MAX(created) AS crt FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id " + cq + " GROUP BY addons.addon_id ORDER BY " + order + " LIMIT 20 OFFSET :offset ) INNER JOIN versions ON ver_row = versions.rowid INNER JOIN addons ON addons.rowid = add_row LEFT JOIN icons ON addons.addon_id = icons.addon_id");
dbQuery.params.offset = pfrom - 1;
data.items = "";
while (dbQuery.executeStep()) {
let item = this.item;
item = item.replace("%NAME%", dbQuery.row.name);
item = item.replace(/%SLUG%/g, dbQuery.row.slug);
item = item.replace("%SUMMARY%", dbQuery.row.summary);
if (dbQuery.row.icon) {
item = item.replace("%ICON%", "chrome://ca-archive/skin/icons/" + dbQuery.row.icon + ".png");
} else {
item = item.replace("%ICON%", "chrome://ca-archive/skin/icons/" + Math.trunc(dbQuery.row.addon_id/1000) + "/" + dbQuery.row.addon_id + ".png");
}
let users = new Intl.NumberFormat("en-US").format(dbQuery.row.users);
item = item.replace("%USERS%", users);
let reviews = new Intl.NumberFormat("en-US").format(dbQuery.row.reviews);
item = item.replace("%REVIEWS%", reviews);
let restart = "";
if (dbQuery.row.is_restart_required == false) {
restart = '&nbsp;<span class="no-restart">No Restart</span>';
}
item = item.replace("%RESTART%", restart);
item = item.replace(/%RATING%/g, Math.round(dbQuery.row.rating));
let experiment = "";
if (dbQuery.row.is_experimental) {
experiment = 'caution';
}
item = item.replace("%EXPERIMENT%", experiment);
let appver;
if (Services.appinfo.name == "Pale Moon") {
appver = "27.9";
} else {
appver = Services.appinfo.version;
}
if (Services.vc.compare(dbQuery.row.min, appver) <= 0 && Services.vc.compare(appver, dbQuery.row.max) <= 0) {
item = item.replace("%COMPAT%", "add");
item = item.replace("%ACTION%", "Install Now");
item = item.replace("%DOWNURL%", "https://addons.mozilla.org/firefox/downloads/file/" + dbQuery.row.url);
} else {
item = item.replace("%COMPAT%", "download");
item = item.replace("%ACTION%", "List Versions");
item = item.replace("%DOWNURL%", "caa:addon/" + dbQuery.row.slug + "/versions");
}
data.items += item;
}
dbQuery.finalize();
return data;
},
processTemplate: function(template, data) {
template = template.replace("%ITEMS%", data.items);
template = template.replace(/%COUNT%/g, data.count);
template = template.replace(/%PAGES%/g, data.pages);
template = template.replace(/%PAGE%/g, data.page);
template = template.replace("%PFROM%", data.pfrom);
template = template.replace("%PTO%", data.pto);
template = template.replace("%PREV%", data.prev);
template = template.replace("%NEXT%", data.next);
template = template.replace(/%DISPREV%/g, data.disprev);
template = template.replace(/%DISNEXT%/g, data.disnext);
template = template.replace("%SORTNAME%", data.sortname);
template = template.replace("%SORT0%", data.srt[0]);
template = template.replace("%SORT1%", data.srt[1]);
template = template.replace("%SORT2%", data.srt[2]);
template = template.replace("%SORT3%", data.srt[3]);
template = template.replace("%SORT4%", data.srt[4]);
template = template.replace("%SORT5%", data.srt[5]);
template = template.replace(/%SORT%/g, data.sort);
template = template.replace(/%CAT%/g, data.cat);
template = template.replace(/%TAG%/g, data.tag);
template = template.replace(/%TAGC%/g, data.tagc);
return template;
},
template: `<html>
<body>
<div>
<section class="secondary">
<nav id="side-nav" class="c" data-addontype="1">
<h2>Explore</h2>
<ul id="side-explore">
<li class="s-users"><em><a href="caa:list?sort=users">Most Popular</a></em></li>
<li class="s-rating"><em><a href="caa:list?sort=rating">Top Rated</a></em></li>
</ul>
<h2>Categories</h2>
<ul id="side-categories">
<li id="c-0"><a href="caa:list%TAGC%">All</a></li>
<li id="c-72"><a href="caa:list/alerts-updates%TAGC%">Alerts &amp; Updates</a></li>
<li id="c-14"><a href="caa:list/appearance%TAGC%">Appearance</a></li>
<li id="c-22"><a href="caa:list/bookmarks%TAGC%">Bookmarks</a></li>
<li id="c-5"><a href="caa:list/download-management%TAGC%">Download Management</a></li>
<li id="c-1"><a href="caa:list/feeds-news-blogging%TAGC%">Feeds, News &amp; Blogging</a></li>
<li id="c-142"><a href="caa:list/games-entertainment%TAGC%">Games &amp; Entertainment</a></li>
<li id="c-37"><a href="caa:list/language-support%TAGC%">Language Support</a></li>
<li id="c-38"><a href="caa:list/photos-music-videos%TAGC%">Photos, Music &amp; Videos</a></li>
<li id="c-12"><a href="caa:list/privacy-security%TAGC%">Privacy &amp; Security</a></li>
<li id="c-13"><a href="caa:list/search-tools%TAGC%">Search Tools</a></li>
<li id="c-141"><a href="caa:list/shopping%TAGC%">Shopping</a></li>
<li id="c-71"><a href="caa:list/social-communication%TAGC%">Social &amp; Communication</a></li>
<li id="c-93"><a href="caa:list/tabs%TAGC%">Tabs</a></li>
<li id="c-4"><a href="caa:list/web-development%TAGC%">Web Development</a></li>
<li id="c-73"><a href="caa:list/other%TAGC%">Other</a></li>
</ul>
</nav>
</section>
<section class="primary">
<h1>%SORTNAME%</h1>
<div class="island hero c listing">
<div id="list-total">%COUNT% items</div>
<div id="sorter" class="c pjax-trigger">
<h3>Sort by:</h3>
<ul>
<li %SORT0%><a class="opt" href="caa:list%CAT%?%TAG%sort=users">Most Users</a></li>
<li %SORT1%><a class="opt" href="caa:list%CAT%?%TAG%sort=rating">Top Rated</a></li>
<li %SORT2%><a class="opt" href="caa:list%CAT%?%TAG%sort=reviews">Most Reviews</a></li>
<li %SORT3%><a class="opt" href="caa:list%CAT%?%TAG%sort=created">Newest</a></li>
<li %SORT4%><a class="opt" href="caa:list%CAT%?%TAG%sort=updated">Recently Updated</a></li>
<li %SORT5%><a class="opt" href="caa:list%CAT%?%TAG%sort=name">Name</a></li>
</ul>
</div>
<div class="items">
%ITEMS%
</div> <!-- items -->
<nav class="paginator c pjax-trigger">
<p class="num">Page <a href="caa:list%CAT%?%TAG%sort=%SORT%&page=%PAGE%">%PAGE%</a> of <a href="caa:list%CAT%?%TAG%sort=%SORT%&page=%PAGES%">%PAGES%</a></p>
<p class="rel">
<a href="caa:list%CAT%?%TAG%sort=%SORT%&page=1" title="Jump to first page" class="jump %DISPREV%">&#9666;&#9666;</a>
<a href="caa:list%CAT%?%TAG%sort=%SORT%&page=%PREV%" class="button prev %DISPREV%">&#9666; Previous</a>
<a href="caa:list%CAT%?%TAG%sort=%SORT%&page=%NEXT%" class="button next %DISNEXT%">Next &#9656;</a>
<a href="caa:list%CAT%?%TAG%sort=%SORT%&page=%PAGES%" title="Jump to last page" class="jump %DISNEXT%">&#9656;&#9656;</a>
</p>
<p class="pos">Showing <b>%PFROM%</b>&#8211;<b>%PTO%</b> of <b>%COUNT%</b></p>
</nav>
</div>
</section>
</div>
</body>
</html>`,
item: `
<div class="item addon">
<div class="info">
<h3>
<a href="caa:addon/%SLUG%"><img src="%ICON%" alt="">%NAME%</a>
%RESTART%
</h3>
<p class="desc">%SUMMARY%</p>
<div class="vitals c">
<span class="rating">
<span class="stars stars-%RATING%" title="Rated %RATING% out of 5 stars">Rated %RATING% out of 5 stars</span>
<a href="caa:addon/%SLUG%">(%REVIEWS%)</a>
</span>
<div class="adu">%USERS% users</div>
</div>
</div>
<div class="action">
<div class="install-shell">
<div class="install clickHijack">
<p class="install-button">
<a class="button %EXPERIMENT% %COMPAT%" href="%DOWNURL%">
<b></b>
<span>%ACTION%</span>
</a>
</p>
</div>
<div class="d2c-reasons-popup popup">
<p>This add-on is not compatible with your version of Firefox because of the following:</p>
<ul></ul>
</div>
<p><a id="downloadAnyway" hidden="true">Download Anyway</a></p>
</div>
</div>
</div>`
};

160
content/tcloud.js Archivo normal
Ver fichero

@@ -0,0 +1,160 @@
"use strict";
let EXPORTED_SYMBOLS = ["TCloud"];
let TCloud = {
showPage: function(document, db) {
let template = this.template;
document.title = "Tag Cloud :: Classic Add-ons Archive";
let contfrag = document.createRange().createContextualFragment(template);
let page = document.getElementById("page");
let frag = contfrag.firstElementChild;
page.appendChild(frag);
},
template: `<html>
<body>
<div>
<section class="secondary">
<nav id="side-nav" class="c" data-addontype="1">
<h2>Explore</h2>
<ul id="side-explore">
<li class="s-users"><em><a href="caa:list?sort=users">Most Popular</a></em></li>
<li class="s-rating"><em><a href="caa:list?sort=rating">Top Rated</a></em></li>
</ul>
<h2>Categories</h2>
<ul id="side-categories">
<li id="c-0"><a href="caa:list">All</a></li>
<li id="c-72"><a href="caa:list/alerts-updates">Alerts &amp; Updates</a></li>
<li id="c-14"><a href="caa:list/appearance">Appearance</a></li>
<li id="c-22"><a href="caa:list/bookmarks">Bookmarks</a></li>
<li id="c-5"><a href="caa:list/download-management">Download Management</a></li>
<li id="c-1"><a href="caa:list/feeds-news-blogging">Feeds, News &amp; Blogging</a></li>
<li id="c-142"><a href="caa:list/games-entertainment">Games &amp; Entertainment</a></li>
<li id="c-37"><a href="caa:list/language-support">Language Support</a></li>
<li id="c-38"><a href="caa:list/photos-music-videos">Photos, Music &amp; Videos</a></li>
<li id="c-12"><a href="caa:list/privacy-security">Privacy &amp; Security</a></li>
<li id="c-13"><a href="caa:list/search-tools">Search Tools</a></li>
<li id="c-141"><a href="caa:list/shopping">Shopping</a></li>
<li id="c-71"><a href="caa:list/social-communication">Social &amp; Communication</a></li>
<li id="c-93"><a href="caa:list/tabs">Tabs</a></li>
<li id="c-4"><a href="caa:list/web-development">Web Development</a></li>
<li id="c-73"><a href="caa:list/other">Other</a></li>
</ul>
</nav>
</section>
<section class="primary">
<h1>Most Popular Tags</h1>
<div class="island hero c listing">
<div class="tcloud" id="demo" style="width: 720px; height: 520px; position: relative;">
<span style="left: 283px; top: 231px;" class="tcw w10"><a href="caa:list?tag=toolbar">toolbar</a></span>
<span style="left: 276px; top: 175px;" class="tcw w9"><a href="caa:list?tag=search">search</a></span>
<span style="left: 228px; top: 293px;" class="tcw w8"><a href="caa:list?tag=google">google</a></span>
<span style="left: 282px; top: 126px;" class="tcw w8"><a href="caa:list?tag=youtube">youtube</a></span>
<span style="left: 367px; top: 289px;" class="tcw w7"><a href="caa:list?tag=tab">tab</a></span>
<span style="left: 433px; top: 296px;" class="tcw w7"><a href="caa:list?tag=facebook">facebook</a></span>
<span style="left: 442px; top: 242px;" class="tcw w7"><a href="caa:list?tag=bookmarks">bookmarks</a></span>
<span style="left: 122px; top: 247px;" class="tcw w7"><a href="caa:list?tag=download">download</a></span>
<span style="left: 223px; top: 352px;" class="tcw w7"><a href="caa:list?tag=security">security</a></span>
<span style="left: 425px; top: 192px;" class="tcw w6"><a href="caa:list?tag=tabs">tabs</a></span>
<span style="left: 166px; top: 155px;" class="tcw w6"><a href="caa:list?tag=privacy">privacy</a></span>
<span style="left: 400px; top: 346px;" class="tcw w6"><a href="caa:list?tag=video">video</a></span>
<span style="left: 264px; top: 82px;" class="tcw w6"><a href="caa:list?tag=shopping">shopping</a></span>
<span style="left: 516px; top: 194px;" class="tcw w6"><a href="caa:list?tag=url">url</a></span>
<span style="left: 451px; top: 137px;" class="tcw w6"><a href="caa:list?tag=twitter">twitter</a></span>
<span style="left: 122px; top: 301px;" class="tcw w5"><a href="caa:list?tag=image">image</a></span>
<span style="left: 206px; top: 396px;" class="tcw w5"><a href="caa:list?tag=bookmark">bookmark</a></span>
<span style="left: 479px; top: 354px;" class="tcw w5"><a href="caa:list?tag=sports">sports</a></span>
<span style="left: 351px; top: 337px;" class="tcw w5"><a href="caa:list?tag=link">link</a></span>
<span style="left: 429px; top: 387px;" class="tcw w5"><a href="caa:list?tag=music">music</a></span>
<span style="left: 165px; top: 109px;" class="tcw w5"><a href="caa:list?tag=amazon">amazon</a></span>
<span style="left: 73px; top: 211px;" class="tcw w5"><a href="caa:list?tag=dictionary">dictionary</a></span>
<span style="left: 204px; top: 218px;" class="tcw w4"><a href="caa:list?tag=social">social</a></span>
<span style="left: 108px; top: 367px;" class="tcw w4"><a href="caa:list?tag=athletics">athletics</a></span>
<span style="left: 568px; top: 205px;" class="tcw w4"><a href="caa:list?tag=news">news</a></span>
<span style="left: 315px; top: 38px;" class="tcw w4"><a href="caa:list?tag=productivity">productivity</a></span>
<span style="left: 547px; top: 157px;" class="tcw w4"><a href="caa:list?tag=share">share</a></span>
<span style="left: 402px; top: 96px;" class="tcw w4"><a href="caa:list?tag=firefox">firefox</a></span>
<span style="left: 319px; top: 428px;" class="tcw w4"><a href="caa:list?tag=button">button</a></span>
<span style="left: 175px; top: 338px;" class="tcw w4"><a href="caa:list?tag=web">web</a></span>
<span style="left: 359px; top: 384px;" class="tcw w4"><a href="caa:list?tag=links">links</a></span>
<span style="left: 583px; top: 335px;" class="tcw w4"><a href="caa:list?tag=seo">seo</a></span>
<span style="left: 91px; top: 188px;" class="tcw w3"><a href="caa:list?tag=college">college</a></span>
<span style="left: 480px; top: 114px;" class="tcw w3"><a href="caa:list?tag=text">text</a></span>
<span style="left: 414px; top: 424px;" class="tcw w3"><a href="caa:list?tag=proxy">proxy</a></span>
<span style="left: 92px; top: 325px;" class="tcw w3"><a href="caa:list?tag=rss">rss</a></span>
<span style="left: 74px; top: 294px;" class="tcw w3"><a href="caa:list?tag=menu">menu</a></span>
<span style="left: 543px; top: 387px;" class="tcw w3"><a href="caa:list?tag=gmail">gmail</a></span>
<span style="left: 132px; top: 398px;" class="tcw w3"><a href="caa:list?tag=history">history</a></span>
<span style="left: 48px; top: 261px;" class="tcw w3"><a href="caa:list?tag=images">images</a></span>
<span style="left: 235px; top: 53px;" class="tcw w3"><a href="caa:list?tag=email">email</a></span>
<span style="left: 487px; top: 77px;" class="tcw w3"><a href="caa:list?tag=password">password</a></span>
<span style="left: 183px; top: 438px;" class="tcw w3"><a href="caa:list?tag=language">language</a></span>
<span style="left: 433px; top: 56px;" class="tcw w3"><a href="caa:list?tag=mp3">mp3</a></span>
<span style="left: 141px; top: 77px;" class="tcw w3"><a href="caa:list?tag=javascript">javascript</a></span>
<span style="left: 486px; top: 428px;" class="tcw w3"><a href="caa:list?tag=block">block</a></span>
<span style="left: 262px; top: 464px;" class="tcw w3"><a href="caa:list?tag=translate">translate</a></span>
<span style="left: 383px; top: 456px;" class="tcw w3"><a href="caa:list?tag=development">development</a></span>
<span style="left: 131px; top: 145px;" class="tcw w2"><a href="caa:list?tag=copy">copy</a></span>
<span style="left: 566px; top: 186px;" class="tcw w2"><a href="caa:list?tag=football">football</a></span>
<span style="left: 524px; top: 117px;" class="tcw w2"><a href="caa:list?tag=save">save</a></span>
<span style="left: 604px; top: 287px;" class="tcw w2"><a href="caa:list?tag=flash">flash</a></span>
<span style="left: 564px; top: 369px;" class="tcw w2"><a href="caa:list?tag=yahoo">yahoo</a></span>
<span style="left: 202px; top: 290px;" class="tcw w2"><a href="caa:list?tag=free">free</a></span>
<span style="left: 629px; top: 265px;" class="tcw w2"><a href="caa:list?tag=sidebar">sidebar</a></span>
<span style="left: 559px; top: 116px;" class="tcw w2"><a href="caa:list?tag=translation">translation</a></span>
<span style="left: 511px; top: 405px;" class="tcw w2"><a href="caa:list?tag=html">html</a></span>
<span style="left: 70px; top: 155px;" class="tcw w2"><a href="caa:list?tag=theme">theme</a></span>
<span style="left: 626px; top: 204px;" class="tcw w2"><a href="caa:list?tag=wikipedia">wikipedia</a></span>
<span style="left: 613px; top: 166px;" class="tcw w2"><a href="caa:list?tag=university">university</a></span>
<span style="left: 100px; top: 119px;" class="tcw w2"><a href="caa:list?tag=bing">bing</a></span>
<span style="left: 220px; top: 91px;" class="tcw w2"><a href="caa:list?tag=css">css</a></span>
<span style="left: 472px; top: 44px;" class="tcw w2"><a href="caa:list?tag=search%20engine">search engine</a></span>
<span style="left: 339px; top: 471px;" class="tcw w2"><a href="caa:list?tag=ads">ads</a></span>
<span style="left: 609px; top: 143px;" class="tcw w2"><a href="caa:list?tag=english">english</a></span>
<span style="left: 113px; top: 100px;" class="tcw w2"><a href="caa:list?tag=online">online</a></span>
<span style="left: 50px; top: 172px;" class="tcw w2"><a href="caa:list?tag=hide">hide</a></span>
<span style="left: 649px; top: 235px;" class="tcw w2"><a href="caa:list?tag=new%20tab">new tab</a></span>
<span style="left: 10px; top: 235px;" class="tcw w2"><a href="caa:list?tag=coupons">coupons</a></span>
<span style="left: 611px; top: 318px;" class="tcw w2"><a href="caa:list?tag=context%20menu">context menu</a></span>
<span style="left: 569px; top: 89px;" class="tcw w2"><a href="caa:list?tag=ebay">ebay</a></span>
<span style="left: 177px; top: 55px;" class="tcw w2"><a href="caa:list?tag=photo">photo</a></span>
<span style="left: 246px; top: 204px;" class="tcw w1"><a href="caa:list?tag=color">color</a></span>
<span style="left: 491px; top: 177px;" class="tcw w1"><a href="caa:list?tag=deals">deals</a></span>
<span style="left: 77px; top: 244px;" class="tcw w1"><a href="caa:list?tag=extension">extension</a></span>
<span style="left: 282px; top: 68px;" class="tcw w1"><a href="caa:list?tag=firebug">firebug</a></span>
<span style="left: 95px; top: 353px;" class="tcw w1"><a href="caa:list?tag=navigation">navigation</a></span>
<span style="left: 137px; top: 174px;" class="tcw w1"><a href="caa:list?tag=chat">chat</a></span>
<span style="left: 367px; top: 495px;" class="tcw w1"><a href="caa:list?tag=cookies">cookies</a></span>
<span style="left: 256px; top: 26px;" class="tcw w1"><a href="caa:list?tag=keyboard">keyboard</a></span>
<span style="left: 195px; top: 373px;" class="tcw w1"><a href="caa:list?tag=mail">mail</a></span>
<span style="left: 93px; top: 405px;" class="tcw w1"><a href="caa:list?tag=popup">popup</a></span>
<span style="left: 545px; top: 445px;" class="tcw w1"><a href="caa:list?tag=addon">addon</a></span>
<span style="left: 636px; top: 359px;" class="tcw w1"><a href="caa:list?tag=downloader">downloader</a></span>
<span style="left: 24px; top: 317px;" class="tcw w1"><a href="caa:list?tag=recommended">recommended</a></span>
<span style="left: 352px; top: 20px;" class="tcw w1"><a href="caa:list?tag=browser">browser</a></span>
<span style="left: 415px; top: 18px;" class="tcw w1"><a href="caa:list?tag=shortcut">shortcut</a></span>
<span style="left: 32px; top: 350px;" class="tcw w1"><a href="caa:list?tag=manager">manager</a></span>
<span style="left: 607px; top: 394px;" class="tcw w1"><a href="caa:list?tag=screenshot">screenshot</a></span>
<span style="left: 587px; top: 424px;" class="tcw w1"><a href="caa:list?tag=testing">testing</a></span>
<span style="left: 55px; top: 379px;" class="tcw w1"><a href="caa:list?tag=tracking">tracking</a></span>
<span style="left: 10px; top: 285px;" class="tcw w1"><a href="caa:list?tag=accessibility">accessibility</a></span>
<span style="left: 661px; top: 292px;" class="tcw w1"><a href="caa:list?tag=notification">notification</a></span>
<span style="left: 430px; top: 483px;" class="tcw w1"><a href="caa:list?tag=sharing">sharing</a></span>
<span style="left: 119px; top: 431px;" class="tcw w1"><a href="caa:list?tag=developer">developer</a></span>
<span style="left: 25px; top: 210px;" class="tcw w1"><a href="caa:list?tag=highlight">highlight</a></span>
<span style="left: 324px; top: 7px;" class="tcw w1"><a href="caa:list?tag=upload">upload</a></span>
</div>
</div>
</section>
</div>
</body>
</html>`
};

217
content/versions.js Archivo normal
Ver fichero

@@ -0,0 +1,217 @@
"use strict";
let EXPORTED_SYMBOLS = ["Versions"];
var Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
let Versions = {
showPage: function(document, db, query, page) {
document.body.className += " gutter versions";
if (page === undefined) {
page = 1;
}
let data = this.loadData(db, query, page);
document.title = data.name + " :: Versions :: Classic Add-ons Archive";
let template = this.template;
template = this.processTemplate(template, data);
let contfrag = document.createRange().createContextualFragment(template);
let pagediv = document.getElementById("page");
let frag = contfrag.firstElementChild;
pagediv.appendChild(frag);
},
loadData: function(db, query, page) {
let col;
if (/^\d+$/.test(query)) {
col = "addon_id";
} else {
col = "slug";
}
let data = {};
let dbQuery = db.createStatement("SELECT COUNT(*) as count, addons.name AS name, slug FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id WHERE addons." + col + " = :query");
dbQuery.params.query = query;
dbQuery.executeStep();
data.name = dbQuery.row.name;
data.slug = dbQuery.row.slug;
let count = dbQuery.row.count;
dbQuery.finalize();
data.page = page;
data.count = new Intl.NumberFormat("en-US").format(count);
data.pages = Math.ceil(count / 30);
let pfrom = (page - 1) * 30 + 1;
data.pfrom = new Intl.NumberFormat("en-US").format(pfrom);
let pto = (pfrom + 29 < count) ? pfrom + 29 : count;
data.pto = new Intl.NumberFormat("en-US").format(pto);
if (page == 1) {
data.disprev = "disabled";
data.prev = "";
} else {
data.disprev = "";
data.prev = parseInt(page) - 1;
}
if (page == data.pages) {
data.disnext = "disabled";
data.next = "";
} else {
data.disnext = "";
data.next = parseInt(page) + 1;
}
dbQuery = db.createStatement("SELECT is_experimental, version, platform, release_notes, is_restart_required, versions.url AS url, min, max, size, created, licenses.name AS lic_name, licenses.url AS lic_url FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id LEFT JOIN licenses ON licenses.license_id = versions.license_id WHERE addons." + col + " = :query ORDER BY created DESC LIMIT 30 OFFSET :offset");
dbQuery.params.query = query;
dbQuery.params.offset = pfrom - 1;
data.items = "";
while (dbQuery.executeStep()) {
let item = this.item;
let experiment = "";
if (dbQuery.row.is_experimental) {
experiment = 'caution';
}
item = item.replace("%EXPERIMENT%", experiment);
let platform = "";
if (dbQuery.row.platform != "" && dbQuery.row.platform != "all") {
platform = " (" + dbQuery.row.platform + ")";
}
item = item.replace(/%VERSION%/g, dbQuery.row.version + platform);
item = item.replace("%RELNOTE%", dbQuery.row.release_notes.replace(/(?:\r\n|\r|\n)/g, "<br>").replace("$", "&#36;"));
let restart = "";
if (dbQuery.row.is_restart_required == false) {
restart = '&nbsp;<span class="no-restart">No Restart</span>';
}
item = item.replace("%RESTART%", restart);
item = item.replace("%MIN%", dbQuery.row.min);
item = item.replace("%MAX%", dbQuery.row.max);
let size, nBytes = dbQuery.row.size;
for (let aMultiples = ["KiB", "MiB", "GiB"], nMultiple = 0, nApprox = nBytes / 1024;
nApprox > 1; nApprox /= 1024, nMultiple++) {
size = nApprox.toFixed(1) + " " + aMultiples[nMultiple];
};
item = item.replace("%SIZE%", size);
let created = new Date(dbQuery.row.created*1000);
item = item.replace("%RELDATE%", created.toLocaleDateString('en-US', {year: 'numeric', month: 'long', day: 'numeric'}));
let license;
if (dbQuery.row.lic_url !== null) {
let lic_url, target;
if (dbQuery.row.lic_url != "") {
lic_url = dbQuery.row.lic_url;
target = 'target="_blank"';
} else {
lic_url = "caa:addon/" + data.slug + "/license/" + dbQuery.row.version;
target = '';
}
license = '<ul class="source"><li>Source code released under <a ' + target + ' href="' + lic_url + '">' + dbQuery.row.lic_name + '</a></li></ul>';
} else {
license = "";
}
item = item.replace("%LICENSE%", license);
let appver;
if (Services.appinfo.name == "Pale Moon") {
appver = "27.9";
} else {
appver = Services.appinfo.version;
}
if (Services.vc.compare(dbQuery.row.min, appver) <= 0 && Services.vc.compare(appver, dbQuery.row.max) <= 0) {
item = item.replace("%COMPAT%", "add");
item = item.replace("%ACTION%", "Install Now");
item = item.replace("%DOWNURL%", "https://addons.mozilla.org/firefox/downloads/file/" + dbQuery.row.url);
} else {
item = item.replace("%COMPAT%", "download");
item = item.replace("%ACTION%", "Download");
item = item.replace("%DOWNURL%", "https://addons.mozilla.org/firefox/downloads/file/" + dbQuery.row.url.replace("/", "/type:attachment/"));
}
data.items += item;
}
dbQuery.finalize();
return data;
},
processTemplate: function(template, data) {
template = template.replace("%ITEMS%", data.items);
template = template.replace(/%NAME%/g, data.name);
template = template.replace(/%SLUG%/g, data.slug);
template = template.replace(/%COUNT%/g, data.count);
template = template.replace(/%PAGES%/g, data.pages);
template = template.replace(/%PAGE%/g, data.page);
template = template.replace("%PFROM%", data.pfrom);
template = template.replace("%PTO%", data.pto);
template = template.replace("%PREV%", data.prev);
template = template.replace("%NEXT%", data.next);
template = template.replace(/%DISPREV%/g, data.disprev);
template = template.replace(/%DISNEXT%/g, data.disnext);
return template;
},
template: `<html>
<body>
<section class="primary">
<header>
<hgroup>
<h1>%NAME% Version History</h1>
<h3><b>%COUNT%</b> versions</h3>
</hgroup>
</header>
<div class="island hero c listing">
<div class="warning highlight">
<span><b>Be careful with old versions!</b> You should always prefer the <a href="caa:addon/%SLUG%">latest version</a> of an add-on.</span>
</div>
<div class="items">
%ITEMS%
</div>
<nav class="paginator c pjax-trigger">
<p class="num">Page <a href="caa:addon/%SLUG%/versions/?page=%PAGE%">%PAGE%</a> of <a href="caa:addon/%SLUG%/versions/?page=%PAGES%">%PAGES%</a></p>
<p class="rel">
<a href="caa:addon/%SLUG%/versions/?page=1" title="Jump to first page" class="jump %DISPREV%">&#9666;&#9666;</a>
<a href="caa:addon/%SLUG%/versions/?page=%PREV%" class="button prev %DISPREV%">&#9666; Previous</a>
<a href="caa:addon/%SLUG%/versions/?page=%NEXT%" class="button next %DISNEXT%">Next &#9656;</a>
<a href="caa:addon/%SLUG%/versions/?page=%PAGES%" title="Jump to last page" class="jump %DISNEXT%">&#9656;&#9656;</a>
</p>
<p class="pos">Showing <b>%PFROM%</b>&#8211;<b>%PTO%</b> of <b>%COUNT%</b></p>
</nav>
</div>
</section>
</body>
</html>`,
item: `
<div class="version item" id="version-%VERSION%">
<div class="info">
<h3>
<a href="caa:addon/%SLUG%/versions?page=%PAGE%#version-%VERSION%" title="Link to this version">Version %VERSION%</a>
<span class="meta">
<time>Released %RELDATE%</time>
<span class="filesize">%SIZE%</span>
</span>
<span class="meta compat">Works with Firefox %MIN% - %MAX%</span>
</h3>
<div class="desc prose">%RELNOTE%</div>
%LICENSE%
</div>
<div class="action">
<div class="install-shell">
<div class="install">
<p class="install-button">
<a class="button %EXPERIMENT% %COMPAT%" href="%DOWNURL%">
<b></b>
<span>%ACTION%</span>
</a>
</p>
</div>
<div class="d2c-reasons-popup popup">
<p>This add-on is not compatible with your version of Firefox because of the following:</p>
<ul></ul>
</div>
<p><a id="downloadAnyway" hidden="true">Download Anyway</a></p>
</div>
</div>
</div>`
};

BIN
icon.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 1.8 KiB

28
install.rdf Archivo normal
Ver fichero

@@ -0,0 +1,28 @@
<?xml version='1.0' encoding='utf-8'?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>ca-archive@Off.JustOff</em:id>
<em:version>1.0.4</em:version>
<em:type>2</em:type>
<em:bootstrap>true</em:bootstrap>
<em:name>Classic Add-ons Archive</em:name>
<em:description>Catalog of classic Firefox add-ons created before WebExtensions apocalypse</em:description>
<em:creator>Off JustOff &lt;Off.Just.Off@gmail.com&gt;</em:creator>
<em:homepageURL>https://github.com/JustOff/ca-archive/</em:homepageURL>
<em:updateURL>https://raw.githubusercontent.com/JustOff/ca-archive/master/update.xml</em:updateURL>
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>45.0</em:minVersion>
<em:maxVersion>56.*</em:maxVersion>
</Description>
</em:targetApplication>
<em:targetApplication>
<Description>
<em:id>{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}</em:id>
<em:minVersion>27.0.0</em:minVersion>
<em:maxVersion>27.*</em:maxVersion>
</Description>
</em:targetApplication>
</Description>
</RDF>

BIN
skin/amo2k17.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 325 B

BIN
skin/bg-header.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 853 B

BIN
skin/btn-search.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 1.7 KiB

BIN
skin/button-icons.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 1.2 KiB

19
skin/button.css Archivo normal
Ver fichero

@@ -0,0 +1,19 @@
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
@-moz-document url("chrome://browser/content/browser.xul"),
url("chrome://global/content/customizeToolbar.xul"),
url("chrome://navigator/content/navigator.xul") {
#ca-archive-button:not([cui-areatype="menu-panel"]) {
-moz-box-orient: horizontal !important;
}
#ca-archive-button {
-moz-image-region: rect(0, 48px, 16px, 32px);
}
#ca-archive-button[cui-areatype="menu-panel"],
toolbarpaletteitem[place="palette"] > #ca-archive-button {
-moz-image-region: rect(0, 32px, 32px, 0);
}
}

BIN
skin/button.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 1.1 KiB

3078
skin/ca-archive.css Archivo normal

La diferencia del archivo ha sido suprimido porque es demasiado grande Cargar Diff

BIN
skin/email.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 300 B

BIN
skin/expando-large.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 1.2 KiB

BIN
skin/go-arrow.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 476 B

BIN
skin/home.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 273 B

BIN
skin/logo.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 2.0 KiB

BIN
skin/logo_archive-sm.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 788 B

BIN
skin/search.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 414 B

BIN
skin/stars-16.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 1.6 KiB

BIN
skin/stars.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 1.2 KiB

BIN
skin/warning-bg.png Archivo normal

Archivo binario no mostrado.

Después

Anchura:  |  Altura:  |  Tamaño: 199 B

30
update.xml Archivo normal
Ver fichero

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<RDF:Description about="urn:mozilla:extension:ca-archive@Off.JustOff">
<em:updates>
<RDF:Seq>
<RDF:li>
<RDF:Description>
<em:version>1.0.4</em:version>
<em:targetApplication>
<RDF:Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<em:minVersion>45.0</em:minVersion>
<em:maxVersion>56.*</em:maxVersion>
<em:updateLink>https://github.com/JustOff/ca-archive/releases/download/1.0.4/ca-archive-1.0.4.xpi</em:updateLink>
</RDF:Description>
</em:targetApplication>
<em:targetApplication>
<RDF:Description>
<em:id>{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}</em:id>
<em:minVersion>27.0.0</em:minVersion>
<em:maxVersion>27.*</em:maxVersion>
<em:updateLink>https://github.com/JustOff/ca-archive/releases/download/1.0.4/ca-archive-1.0.4.xpi</em:updateLink>
</RDF:Description>
</em:targetApplication>
</RDF:Description>
</RDF:li>
</RDF:Seq>
</em:updates>
</RDF:Description>
</RDF:RDF>