[Pkg-mozext-commits] [firetray] 222/399: Merge branch 'themable-icons'
David Prévot
taffit at alioth.debian.org
Tue Oct 29 18:23:47 UTC 2013
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch dfsg-clean
in repository firetray.
commit e679619f192107815b4736e6b371e7284ee71807
Merge: b313970 e19930b
Author: foudfou <foudil.newbie+git at gmail.com>
Date: Sat Apr 7 23:06:54 2012 +0200
Merge branch 'themable-icons'
Conflicts:
src/chrome/content/options.js
src/chrome/content/options.xul
src/modules/FiretrayHandler.jsm
src/modules/commons.js
src/modules/linux/FiretrayStatusIcon.jsm
src/Makefile | 9 +-
src/chrome/content/options.js | 83 ++++++++++++-
src/chrome/content/options.xul | 74 ++++++++++--
src/chrome/locale/en-US/options.dtd | 13 +-
src/chrome/skin/chatzilla22.png | Bin 0 -> 1200 bytes
src/chrome/skin/chatzilla32.png | Bin 1950 -> 0 bytes
src/chrome/skin/firefox22.png | Bin 0 -> 1625 bytes
src/chrome/skin/firefox32.png | Bin 2912 -> 0 bytes
.../linux/icons/gnome/22x22/status/mail-unread.png | 1 +
.../linux/icons/hicolor/22x22/apps/chatzilla.png | 1 +
.../linux/icons/hicolor/22x22/apps/firefox.png | 1 +
.../linux/icons/hicolor/22x22/apps/seamonkey.png | 1 +
.../linux/icons/hicolor/22x22/apps/thunderbird.png | 1 +
src/chrome/skin/mail-unread.png | Bin 0 -> 1100 bytes
src/chrome/skin/message-mail-new.png | Bin 770 -> 0 bytes
src/chrome/skin/seamonkey22.png | Bin 0 -> 1482 bytes
src/chrome/skin/seamonkey32.png | Bin 2015 -> 0 bytes
src/chrome/skin/thunderbird22.png | Bin 0 -> 1652 bytes
src/chrome/skin/thunderbird32.png | Bin 2884 -> 0 bytes
src/defaults/preferences/prefs.js | 6 +
src/modules/FiretrayHandler.jsm | 15 ++-
src/modules/FiretrayMessaging.jsm | 4 +-
src/modules/commons.js | 16 ++-
src/modules/ctypes/linux/gio.jsm | 23 ++++
src/modules/ctypes/linux/gobject.jsm | 5 +-
src/modules/ctypes/linux/gtk.jsm | 9 ++
src/modules/linux/FiretrayStatusIcon.jsm | 125 +++++++++++++++++---
27 files changed, 337 insertions(+), 50 deletions(-)
diff --cc src/chrome/content/options.js
index 3c52a74,bd4c21c..0618d63
--- a/src/chrome/content/options.js
+++ b/src/chrome/content/options.js
@@@ -56,10 -60,11 +60,11 @@@ var firetrayUIOptions =
targetNode.hidden = hiddenval;
},
- disableGroup: function(group, disableval) {
+ disableChildren: function(group, disableval) {
try {
- for (let i=0, len=group.childNodes.length; i<len ; ++i)
- group.childNodes[i].disabled = disableval;
+ let children = group.childNodes;
+ for (let i=0, len=children.length; i<len ; ++i)
+ children[i].disabled = disableval;
} catch(e) {}
},
@@@ -81,9 -78,69 +86,69 @@@
updateScrollOptions: function() {
let scroll_hides = document.getElementById("ui_scroll_hides").checked;
- this.disableGroup(document.getElementById("ui_radiogroup_scroll"), !scroll_hides);
+ this.disableChildren(document.getElementById("ui_radiogroup_scroll"), !scroll_hides);
},
+ initAppIconType: function() {
+ document.getElementById("ui_app_icon_type_themed").value =
+ FIRETRAY_APPLICATION_ICON_TYPE_THEMED;
+ document.getElementById("ui_app_icon_type_custom").value =
+ FIRETRAY_APPLICATION_ICON_TYPE_CUSTOM;
+
+ let prefAppIconType = firetray.Utils.prefService.getIntPref("app_icon_type");
+ document.getElementById("ui_app_icon_type").selectedIndex = prefAppIconType;
+
+ this.disableIconTypeMaybe(prefAppIconType);
+ },
+
+ initAppIconNames: function() {
+ this.initIconNames(firetray.StatusIcon.prefAppIconNames,
+ "app_icon_type_themed_name", firetray.StatusIcon.defaultAppIconName);
+ },
+ initNewMailIconNames: function() {
+ this.initIconNames("new_mail_icon_names",
+ "radio_mail_notification_newmail_icon_name", firetray.StatusIcon.defaultNewMailIconName);
+ },
+
+ initIconNames: function(prefIconNames, uiIconNameId, defaultIconName) {
+ let appIconNames = firetray.Utils.getArrayPref(prefIconNames);
- LOG("appIconNames="+appIconNames);
++ F.LOG("appIconNames="+appIconNames);
+ let len = appIconNames.length;
+ if (len>2)
+ throw new RangeError("Too many icon names");
+ for (let i=0; i<len; ++i) {
+ let textbox = document.getElementById(uiIconNameId+(i+1));
+ textbox.value = appIconNames[i];
+ }
+ let textbox = document.getElementById(uiIconNameId+3);
+ textbox.value = defaultIconName;
+ },
+
+ updateAppIconNames: function(textbox) {
+ this.updateIconNames(firetray.StatusIcon.prefAppIconNames, "app_icon_type_themed_name");
+ },
+ updateNewMailIconNames: function(textbox) {
+ this.updateIconNames("new_mail_icon_names", "radio_mail_notification_newmail_icon_name");
+ },
+
+ updateIconNames: function(prefIconNames, uiIconNameId) {
+ let iconNames = [];
+ for (let i=1; i<3; ++i) {
+ let textbox = document.getElementById(uiIconNameId+i);
+ let val = textbox.value.trim();
- LOG("val="+val);
++ F.LOG("val="+val);
+ if (val) iconNames.push(val);
+ }
- LOG("iconNames="+iconNames);
++ F.LOG("iconNames="+iconNames);
+ firetray.Utils.setArrayPref(prefIconNames, iconNames);
+ },
+
+ disableIconTypeMaybe: function(appIconType) {
+ let customIconGroup = document.getElementById("custom_app_icon");
- this.disableGroup(customIconGroup,
- (appIconType !== FIRETRAY_APPLICATION_ICON_TYPE_CUSTOM));
++ this.disableChildren(customIconGroup,
++ (appIconType !== FIRETRAY_APPLICATION_ICON_TYPE_CUSTOM));
+ },
+
initMailControls: function() {
this.populateExcludedFoldersList();
this.populateTreeAccountsOrServerTypes();
diff --cc src/chrome/content/options.xul
index 15a2c2b,d40eac4..5c86e66
--- a/src/chrome/content/options.xul
+++ b/src/chrome/content/options.xul
@@@ -24,8 -24,9 +24,10 @@@
<preference id="pref_hides_single_window" name="extensions.firetray.hides_single_window" type="bool"/>
<preference id="pref_start_hidden" name="extensions.firetray.start_hidden" type="bool"/>
<preference id="pref_show_activates" name="extensions.firetray.show_activates" type="bool"/>
+ <preference id="pref_remember_desktop" name="extensions.firetray.remember_desktop" type="bool"/>
<preference id="pref_show_icon_on_hide" name="extensions.firetray.show_icon_on_hide" type="bool"/>
+ <preference id="pref_app_icon_type" name="extensions.firetray.app_icon_type" type="int"/>
+ <preference id="pref_app_icon_filename" name="extensions.firetray.app_icon_filename" type="string"/>
<preference id="pref_scroll_hides" name="extensions.firetray.scroll_hides" type="bool" />
<preference id="pref_scroll_mode" name="extensions.firetray.scroll_mode" type="string" />
<preference id="pref_icon_text_color" name="extensions.firetray.icon_text_color" type="string" />
@@@ -67,13 -66,44 +68,47 @@@
label="&bool_show_activates.label;"
accesskey="&bool_show_activates.accesskey;"
tooltiptext="&bool_show_activates.tooltip;"/>
+ <checkbox id="ui_remember_desktop" preference="pref_remember_desktop"
+ label="&bool_remember_desktop.label;"
+ accesskey="&bool_remember_desktop.accesskey;"/>
- </groupbox>
- <groupbox>
- <caption label="&icon_settings;" />
+ </vbox>
+ </tabpanel>
+
+
+ <tabpanel id="icon_tabpanel" flex="1">
+ <vbox pack="start" align="left" flex="1">
+
+ <radiogroup id="ui_app_icon_type" preference="pref_app_icon_type"
+ oncommand="firetrayUIOptions.disableIconTypeMaybe(this.selectedIndex);">
+ <vbox align="left" flex="1">
+ <label class="header">&app_icon_type;</label>
+
+ <hbox>
+ <radio id="ui_app_icon_type_themed" label="&app_icon_themed.label;"
+ accesskey="&app_icon_themed.accesskey;" tooltiptext="&icon_themed.tooltip;" />
+ <textbox id="app_icon_type_themed_name1" size="12" placeholder="&app_icon_themed_name;"
+ onchange="firetrayUIOptions.updateAppIconNames(this);" flex="1" />
+ <textbox id="app_icon_type_themed_name2" size="12" placeholder="&app_icon_themed_name;"
+ onchange="firetrayUIOptions.updateAppIconNames(this);" flex="1" />
+ <textbox id="app_icon_type_themed_name3" size="12" placeholder="&app_icon_themed_name;"
+ onchange="firetrayUIOptions.updateAppIconNames(this);" flex="1"
+ disabled="true"/>
+ </hbox>
+ <hbox id="ui_app_icon_type_custom_group">
+ <radio id="ui_app_icon_type_custom" label="&app_icon_custom.label;"
+ accesskey="&app_icon_custom.accesskey;" />
+ <hbox id="custom_app_icon" align="center" flex="1" >
+ <textbox id="app_icon_custom_filename" preference="pref_app_icon_filename" flex="1" />
+ <button id="app_icon_custom_select" label="&choose;"
+ accesskey="&choose.accesskey;"
+ oncommand="firetrayUIOptions.chooseAppIconFile()" />
+ </hbox>
+ </hbox>
+
+ </vbox>
+ </radiogroup>
+
<checkbox id="ui_show_icon_on_hide" preference="pref_show_icon_on_hide"
label="&bool_show_icon_on_hide.label;"
accesskey="&bool_show_icon_on_hide.accesskey;"/>
diff --cc src/chrome/locale/en-US/options.dtd
index ed2bebd,00257ef..121a731
--- a/src/chrome/locale/en-US/options.dtd
+++ b/src/chrome/locale/en-US/options.dtd
@@@ -20,12 -20,17 +20,19 @@@
<!ENTITY bool_show_activates.label "Activate restored windows">
<!ENTITY bool_show_activates.accesskey "e">
<!ENTITY bool_show_activates.tooltip "restored windows raise on top and get focus">
+<!ENTITY bool_remember_desktop.label "Remember desktop (per-window)">
+<!ENTITY bool_remember_desktop.accesskey "R">
- <!ENTITY icon_settings "Icon settings">
<!ENTITY bool_show_icon_on_hide.label "Show tray icon only if a window is hidden">
<!ENTITY bool_show_icon_on_hide.accesskey "w">
+ <!ENTITY app_icon_type "Application icon type">
+ <!ENTITY app_icon_themed.label "Default themed">
+ <!ENTITY app_icon_themed.accesskey "D">
+ <!ENTITY app_icon_themed_name "icon-name">
+ <!ENTITY icon_themed.tooltip "Icon names provided by graphical environment">
+ <!ENTITY app_icon_custom.label "Custom">
+ <!ENTITY app_icon_custom.accesskey "u">
+
<!ENTITY mouse_wheel_options "Mouse wheel options" >
<!ENTITY enable_mouse_scroll.label "Handle mouse scroll on tray icon" >
<!ENTITY enable_mouse_scroll.accesskey "l">
diff --cc src/defaults/preferences/prefs.js
index 44563e0,17e2bff..dcafd7d
--- a/src/defaults/preferences/prefs.js
+++ b/src/defaults/preferences/prefs.js
@@@ -6,11 -9,16 +6,17 @@@ pref("extensions.firetray.firstrun", tr
pref("extensions.firetray.hides_on_close", true);
pref("extensions.firetray.hides_on_minimize", true);
-pref("extensions.firetray.hides_single_window", false);
+pref("extensions.firetray.hides_single_window", true);
pref("extensions.firetray.start_hidden", false);
pref("extensions.firetray.show_activates", false);
+pref("extensions.firetray.remember_desktop", false);
+ pref("extensions.firetray.app_icon_type", 0);
+ pref("extensions.firetray.app_browser_icon_names", '["web-browser", "internet-web-browser"]');
+ pref("extensions.firetray.app_mail_icon_names", '["indicator-messages", "applications-email-panel"]');
+ pref("extensions.firetray.app_default_icon_names", '[]');
+ pref("extensions.firetray.app_icon_filename", "");
+ pref("extensions.firetray.new_mail_icon_names", '["indicator-messages-new", "mail-message-new"]');
pref("extensions.firetray.show_icon_on_hide", false);
pref("extensions.firetray.scroll_hides", true);
pref("extensions.firetray.scroll_mode", "down_hides");
diff --cc src/modules/FiretrayHandler.jsm
index 3ec4f23,7812ed0..6f702a8
--- a/src/modules/FiretrayHandler.jsm
+++ b/src/modules/FiretrayHandler.jsm
@@@ -390,10 -367,21 +391,22 @@@ firetray.PrefListener = new PrefListene
case 'show_icon_on_hide':
firetray.Handler.showHideIcon();
break;
+ case 'new_mail_icon_names':
+ firetray.StatusIcon.loadThemedIcons();
case 'message_count_type':
+ case 'folder_count_recursive':
firetray.Messaging.updateMsgCount();
break;
+ case 'app_mail_icon_names':
+ case 'app_browser_icon_names':
+ case 'app_default_icon_names':
+ firetray.StatusIcon.loadThemedIcons();
+ case 'app_icon_type':
+ if (firetray.Handler.inMailApp)
+ firetray.Messaging.updateMsgCount();
+ else
+ firetray.Handler.setIconImageDefault();
+ break;
default:
}
});
diff --cc src/modules/FiretrayMessaging.jsm
index 5100bf9,47eb534..d4741ff
--- a/src/modules/FiretrayMessaging.jsm
+++ b/src/modules/FiretrayMessaging.jsm
@@@ -183,13 -129,17 +183,13 @@@ firetray.Messaging =
break;
case FIRETRAY_NOTIFICATION_CUSTOM_ICON:
let prefCustomIconPath = firetray.Utils.prefService.getCharPref("custom_mail_icon");
- firetray.Handler.setIconImage(prefCustomIconPath);
+ firetray.Handler.setIconImageFromFile(prefCustomIconPath);
break;
default:
- ERROR("Unknown notification mode: "+prefMailNotification);
+ F.ERROR("Unknown notification mode: "+prefMailNotification);
}
- let localizedMessage = PluralForm.get(
- newMsgCount,
- firetray.Utils.strings.GetStringFromName("tooltip.unread_messages"))
- .replace("#1", newMsgCount);;
- firetray.Handler.setIconTooltip(localizedMessage);
+ firetray.Handler.setIconTooltip(localizedTooltip);
} else {
throw "negative message count"; // should never happen
diff --cc src/modules/commons.js
index 2934199,b1f1e81..5edba42
--- a/src/modules/commons.js
+++ b/src/modules/commons.js
@@@ -3,13 -3,15 +3,15 @@@
/* for now, logging facilities (imported from logging.jsm) are automatically
provided by this module */
var EXPORTED_SYMBOLS =
- [ "firetray", "LOG", "WARN", "ERROR", "FIREFOX_ID", "THUNDERBIRD_ID",
- "SEAMONKEY_ID", "FIRETRAY_ID", "FIRETRAY_SPLASH_PAGE",
+ [ "firetray", "F", "FIRETRAY_ID", "FIRETRAY_SPLASH_PAGE",
+ "FIRETRAY_APPLICATION_ICON_TYPE_THEMED",
- "FIRETRAY_APPLICATION_ICON_TYPE_CUSTOM", "getType", "isArray", "isEmpty",
- "strEquals", "FIRETRAY_NOTIFICATION_UNREAD_MESSAGE_COUNT",
++ "FIRETRAY_APPLICATION_ICON_TYPE_CUSTOM",
+ "FIRETRAY_NOTIFICATION_UNREAD_MESSAGE_COUNT",
"FIRETRAY_NOTIFICATION_NEWMAIL_ICON", "FIRETRAY_NOTIFICATION_CUSTOM_ICON",
"FIRETRAY_DELAY_BROWSER_STARTUP_MILLISECONDS",
-- "FIRETRAY_DELAY_NOWAIT_MILLISECONDS", "FIRETRAY_MESSAGE_COUNT_TYPE_UNREAD",
- "FIRETRAY_MESSAGE_COUNT_TYPE_NEW" ];
++ "FIRETRAY_DELAY_NOWAIT_MILLISECONDS",
+ "FIRETRAY_DELAY_PREF_CLEANING_MILLISECONDS",
- "FIRETRAY_MESSAGE_COUNT_TYPE_NEW" ];
++ "FIRETRAY_MESSAGE_COUNT_TYPE_UNREAD", "FIRETRAY_MESSAGE_COUNT_TYPE_NEW" ];
const Cc = Components.classes;
const Ci = Components.interfaces;
@@@ -237,3 -219,33 +242,10 @@@ if(!Object.keys) Object.keys = function
for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
return ret;
};
+
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/Trim
+ if(!String.prototype.trim) {
+ String.prototype.trim = function () {
+ return this.replace(/^\s+|\s+$/g,'');
+ };
+ }
-
-// http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object-from-json
-function isEmpty(obj) {
- for(var prop in obj) {
- if(obj.hasOwnProperty(prop))
- return false;
- }
- return true;
-}
-
-// values of different ctypes objects can never be compared. See:
-// https://developer.mozilla.org/en/js-ctypes/Using_js-ctypes/Working_with_data#Quirks_in_equality
-function strEquals(obj1, obj2) {
- return obj1.toString() === obj2.toString();
-}
-
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Custom_Error_Types
-function DeleteError(message) {
- this.name = "DeleteError";
- this.message = message || "Could not delete object memeber";
-}
-DeleteError.prototype = new Error();
-DeleteError.prototype.constructor = DeleteError;
diff --cc src/modules/linux/FiretrayStatusIcon.jsm
index d6fda96,868490d..c8be041
--- a/src/modules/linux/FiretrayStatusIcon.jsm
+++ b/src/modules/linux/FiretrayStatusIcon.jsm
@@@ -22,17 -23,34 +23,34 @@@ if ("undefined" == typeof(firetray.Hand
firetray.StatusIcon = {
+ GTK_THEME_ICON_PATH: null,
+
initialized: false,
- // pointers to JS functions. MUST LIVE DURING ALL THE EXECUTION
- callbacks: {},
+ callbacks: {}, // pointers to JS functions. MUST LIVE DURING ALL THE EXECUTION
trayIcon: null,
+ themedIconApp: null,
+ themedIconNewMail: null,
+ prefAppIconNames: null,
+ prefNewMailIconNames: null,
+ defaultAppIconName: null,
+ defaultNewMailIconName: null,
init: function() {
+ this.defineIconNames();
+
try {
- // init tray icon, some variables
+ this.GTK_THEME_ICON_PATH = firetray.Utils.chromeToPath("chrome://firetray/skin/linux/icons");
- LOG(this.GTK_THEME_ICON_PATH);
++ F.LOG(this.GTK_THEME_ICON_PATH);
+ let gtkIconTheme = gtk.gtk_icon_theme_get_default();
- LOG("gtkIconTheme="+gtkIconTheme);
++ F.LOG("gtkIconTheme="+gtkIconTheme);
+ gtk.gtk_icon_theme_append_search_path(gtkIconTheme, this.GTK_THEME_ICON_PATH);
+
+ this.loadThemedIcons();
+
this.trayIcon = gtk.gtk_status_icon_new();
+
} catch (x) {
- ERROR(x);
+ F.ERROR(x);
return false;
}
@@@ -55,6 -73,58 +73,58 @@@
this.initialized = false;
},
+ defineIconNames: function() {
+ this.prefAppIconNames = (function() {
+ if (firetray.Handler.inMailApp) {
+ return "app_mail_icon_names";
+ } else if (firetray.Handler.inBrowserApp) {
+ return "app_browser_icon_names";
+ } else {
+ return "app_default_icon_names";
+ }
+ })();
- this.defaultAppIconName = firetray.Handler.appNameOriginal.toLowerCase();
++ this.defaultAppIconName = firetray.Handler.appName.toLowerCase();
+
+ this.prefNewMailIconNames = "new_mail_icon_names";
+ this.defaultNewMailIconName = "mail-unread";
+ },
+
+ loadThemedIcons: function() {
+ if (firetray.Handler.inMailApp) {
+ let newMailIconNames = this.getNewMailIconNames();
+ if (this.themedIconNewMail) gobject.g_object_unref(this.themedIconNewMail);
+ this.themedIconNewMail = this.initThemedIcon(newMailIconNames);
+ }
+ let appIconNames = this.getAppIconNames();
+ if (this.themedIconApp) gobject.g_object_unref(this.themedIconApp);
+ this.themedIconApp = this.initThemedIcon(appIconNames);
+ },
+
+ getAppIconNames: function() {
+ let appIconNames = firetray.Utils.getArrayPref(this.prefAppIconNames);
+ appIconNames.push(this.defaultAppIconName);
+ return appIconNames;
+ },
+ getNewMailIconNames: function() {
+ let newMailIconNames = firetray.Utils.getArrayPref(this.prefNewMailIconNames);
+ newMailIconNames.push(this.defaultNewMailIconName);
+ return newMailIconNames;
+ },
+
+ initThemedIcon: function(names) {
- if (!isArray(names)) throw new TypeError();
- LOG("themedIconNames="+names);
++ if (!firetray.js.isArray(names)) throw new TypeError();
++ F.LOG("themedIconNames="+names);
+ let namesLen = names.length;
- LOG("themedIconNamesLen="+namesLen);
++ F.LOG("themedIconNamesLen="+namesLen);
+ let themedIconNames = ctypes.char.ptr.array(namesLen)();
+ for (let i=0; i<namesLen; ++i)
+ themedIconNames[i] = ctypes.char.array()(names[i]);
- LOG("themedIconNames="+themedIconNames);
++ F.LOG("themedIconNames="+themedIconNames);
+ let themedIcon = gio.g_themed_icon_new_from_names(themedIconNames, namesLen);
- LOG("themedIcon="+themedIcon);
++ F.LOG("themedIcon="+themedIcon);
+ return themedIcon;
+ },
+
addCallbacks: function() {
/* NOTE: here we do use a function handler (instead of a function
definition) because we need the args passed to it ! As a consequence, we
@@@ -99,8 -169,30 +169,30 @@@
firetray.Handler.showAllWindows();
break;
default:
- ERROR("SCROLL UNKNOWN");
+ F.ERROR("SCROLL UNKNOWN");
}
+ },
+
+ setIconImageFromFile: function(filename) {
+ if (!firetray.StatusIcon.trayIcon)
- ERROR("Icon missing");
- LOG(filename);
++ F.ERROR("Icon missing");
++ F.LOG(filename);
+ gtk.gtk_status_icon_set_from_file(firetray.StatusIcon.trayIcon,
+ filename);
+ },
+
+ setIconImageFromName: function(iconName) {
+ if (!firetray.StatusIcon.trayIcon)
- ERROR("Icon missing");
- LOG(iconName);
++ F.ERROR("Icon missing");
++ F.LOG(iconName);
+ gtk.gtk_status_icon_set_from_icon_name(firetray.StatusIcon.trayIcon, iconName);
+ },
+
+ setIconImageFromGIcon: function(gicon) {
+ if (!firetray.StatusIcon.trayIcon || !gicon)
- ERROR("Icon missing");
- LOG(gicon);
++ F.ERROR("Icon missing");
++ F.LOG(gicon);
+ gtk.gtk_status_icon_set_from_gicon(firetray.StatusIcon.trayIcon, gicon);
}
}; // firetray.StatusIcon
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/firetray.git
More information about the Pkg-mozext-commits
mailing list