diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/calendar/base/content/dialogs/calendar-dialog-utils.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/calendar/base/content/dialogs/calendar-dialog-utils.js
--- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/calendar/base/content/dialogs/calendar-dialog-utils.js 2015-04-22 13:03:28.000000000 +0000
+++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/calendar/base/content/dialogs/calendar-dialog-utils.js 2015-04-24 19:30:09.000000000 +0000
@@ -318,7 +318,7 @@
let propIterator = fixIterator(item.propertyEnumerator, Components.interfaces.nsIProperty);
let propsToDelete = [
prop.name
- for each (prop in propIterator)
+ for (prop in propIterator)
if (prop.name.substr(0, cmpLength) == cmp)
];
diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/calendar/timezones/zones.json thunderbird-trunk-40.0~a1~hg20150424r17837.240895/calendar/timezones/zones.json
--- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/calendar/timezones/zones.json 2015-04-22 13:03:30.000000000 +0000
+++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/calendar/timezones/zones.json 2015-04-24 19:30:10.000000000 +0000
@@ -1,18 +1,42 @@
{
- "version": "2.2015a",
+ "version": "2.2015b",
"aliases": {
+ "AUS Central Standard Time": {
+ "aliasTo": "Australia/Darwin"
+ },
+ "AUS Eastern Standard Time": {
+ "aliasTo": "Australia/Sydney"
+ },
+ "Afghanistan Standard Time": {
+ "aliasTo": "Asia/Kabul"
+ },
"Africa/Asmera": {
"aliasTo": "Africa/Asmara"
},
"Africa/Timbuktu": {
"aliasTo": "Africa/Bamako"
},
+ "Alaskan Standard Time": {
+ "aliasTo": "America/Anchorage"
+ },
"America/Argentina/ComodRivadavia": {
"aliasTo": "America/Argentina/Catamarca"
},
"America/Louisville": {
"aliasTo": "America/Kentucky/Louisville"
},
+ "Arab Standard Time": {
+ "aliasTo": "Asia/Riyadh"
+ },
+ "Arabian Standard Time": {
+ "aliasTo": "Asia/Dubai"
+ },
+ "Arabic Standard Time": {
+ "aliasTo": "Asia/Baghdad"
+ },
+ "Argentina Standard Time": {
+ "aliasTo": "America/Buenos_Aires"
+ },
"Asia/Calcutta": {
"aliasTo": "Asia/Kolkata"
},
@@ -22,12 +46,87 @@
"Asia/Saigon": {
"aliasTo": "Asia/Ho_Chi_Minh"
},
+ "Atlantic Standard Time": {
+ "aliasTo": "America/Halifax"
+ },
"Atlantic/Faeroe": {
"aliasTo": "Atlantic/Faroe"
},
"Atlantic/Jan_Mayen": {
"aliasTo": "Europe/Oslo"
},
+ "Azerbaijan Standard Time": {
+ "aliasTo": "Asia/Baku"
+ },
+ "Azores Standard Time": {
+ "aliasTo": "Atlantic/Azores"
+ },
+ "Bahia Standard Time": {
+ "aliasTo": "America/Bahia"
+ },
+ "Bangladesh Standard Time": {
+ "aliasTo": "Asia/Dhaka"
+ },
+ "Belarus Standard Time": {
+ "aliasTo": "Europe/Minsk"
+ },
+ "Canada Central Standard Time": {
+ "aliasTo": "America/Regina"
+ },
+ "Cape Verde Standard Time": {
+ "aliasTo": "Atlantic/Cape_Verde"
+ },
+ "Caucasus Standard Time": {
+ "aliasTo": "Asia/Yerevan"
+ },
+ "Cen. Australia Standard Time": {
+ "aliasTo": "Australia/Adelaide"
+ },
+ "Central America Standard Time": {
+ "aliasTo": "America/Guatemala"
+ },
+ "Central Asia Standard Time": {
+ "aliasTo": "Asia/Almaty"
+ },
+ "Central Brazilian Standard Time": {
+ "aliasTo": "America/Cuiaba"
+ },
+ "Central Europe Standard Time": {
+ "aliasTo": "Europe/Budapest"
+ },
+ "Central European Standard Time": {
+ "aliasTo": "Europe/Warsaw"
+ },
+ "Central Pacific Standard Time": {
+ "aliasTo": "Pacific/Guadalcanal"
+ },
+ "Central Standard Time": {
+ "aliasTo": "America/Chicago"
+ },
+ "Central Standard Time (Mexico)": {
+ "aliasTo": "America/Mexico_City"
+ },
+ "China Standard Time": {
+ "aliasTo": "Asia/Shanghai"
+ },
+ "E. Africa Standard Time": {
+ "aliasTo": "Africa/Nairobi"
+ },
+ "E. Australia Standard Time": {
+ "aliasTo": "Australia/Brisbane"
+ },
+ "E. South America Standard Time": {
+ "aliasTo": "America/Sao_Paulo"
+ },
+ "Eastern Standard Time": {
+ "aliasTo": "America/New_York"
+ },
+ "Egypt Standard Time": {
+ "aliasTo": "Africa/Cairo"
+ },
+ "Ekaterinburg Standard Time": {
+ "aliasTo": "Asia/Yekaterinburg"
+ },
"Etc/GMT": {
"aliasTo": "UTC"
},
@@ -49,24 +148,222 @@
"Europe/Belfast": {
"aliasTo": "Europe/London"
},
+ "FLE Standard Time": {
+ "aliasTo": "Europe/Kiev"
+ },
+ "Fiji Standard Time": {
+ "aliasTo": "Pacific/Fiji"
+ },
"GMT": {
"aliasTo": "UTC"
},
+ "GMT Standard Time": {
+ "aliasTo": "Europe/London"
+ },
"GMT+0": {
"aliasTo": "UTC"
},
"GMT0": {
"aliasTo": "UTC"
},
+ "GTB Standard Time": {
+ "aliasTo": "Europe/Bucharest"
+ },
+ "Georgian Standard Time": {
+ "aliasTo": "Asia/Tbilisi"
+ },
+ "Greenland Standard Time": {
+ "aliasTo": "America/Godthab"
+ },
"Greenwich": {
"aliasTo": "UTC"
},
+ "Greenwich Standard Time": {
+ "aliasTo": "Atlantic/Reykjavik"
+ },
+ "Hawaiian Standard Time": {
+ "aliasTo": "Pacific/Honolulu"
+ },
+ "India Standard Time": {
+ "aliasTo": "Asia/Calcutta"
+ },
+ "Iran Standard Time": {
+ "aliasTo": "Asia/Tehran"
+ },
+ "Israel Standard Time": {
+ "aliasTo": "Asia/Jerusalem"
+ },
+ "Jordan Standard Time": {
+ "aliasTo": "Asia/Amman"
+ },
+ "Kaliningrad Standard Time": {
+ "aliasTo": "Europe/Kaliningrad"
+ },
+ "Korea Standard Time": {
+ "aliasTo": "Asia/Seoul"
+ },
+ "Libya Standard Time": {
+ "aliasTo": "Africa/Tripoli"
+ },
+ "Line Islands Standard Time": {
+ "aliasTo": "Pacific/Kiritimati"
+ },
+ "Magadan Standard Time": {
+ "aliasTo": "Asia/Magadan"
+ },
+ "Mauritius Standard Time": {
+ "aliasTo": "Indian/Mauritius"
+ },
+ "Middle East Standard Time": {
+ "aliasTo": "Asia/Beirut"
+ },
+ "Montevideo Standard Time": {
+ "aliasTo": "America/Montevideo"
+ },
+ "Morocco Standard Time": {
+ "aliasTo": "Africa/Casablanca"
+ },
+ "Mountain Standard Time": {
+ "aliasTo": "America/Denver"
+ },
+ "Mountain Standard Time (Mexico)": {
+ "aliasTo": "America/Chihuahua"
+ },
+ "Myanmar Standard Time": {
+ "aliasTo": "Asia/Rangoon"
+ },
+ "N. Central Asia Standard Time": {
+ "aliasTo": "Asia/Novosibirsk"
+ },
+ "Namibia Standard Time": {
+ "aliasTo": "Africa/Windhoek"
+ },
+ "Nepal Standard Time": {
+ "aliasTo": "Asia/Katmandu"
+ },
+ "New Zealand Standard Time": {
+ "aliasTo": "Pacific/Auckland"
+ },
+ "Newfoundland Standard Time": {
+ "aliasTo": "America/St_Johns"
+ },
+ "North Asia East Standard Time": {
+ "aliasTo": "Asia/Irkutsk"
+ },
+ "North Asia Standard Time": {
+ "aliasTo": "Asia/Krasnoyarsk"
+ },
+ "Pacific SA Standard Time": {
+ "aliasTo": "America/Santiago"
+ },
+ "Pacific Standard Time": {
+ "aliasTo": "America/Los_Angeles"
+ },
+ "Pacific Standard Time (Mexico)": {
+ "aliasTo": "America/Santa_Isabel"
+ },
+ "Pakistan Standard Time": {
+ "aliasTo": "Asia/Karachi"
+ },
+ "Paraguay Standard Time": {
+ "aliasTo": "America/Asuncion"
+ },
+ "Romance Standard Time": {
+ "aliasTo": "Europe/Paris"
+ },
+ "Russia Time Zone 10": {
+ "aliasTo": "Asia/Srednekolymsk"
+ },
+ "Russia Time Zone 11": {
+ "aliasTo": "Asia/Kamchatka"
+ },
+ "Russia Time Zone 3": {
+ "aliasTo": "Europe/Samara"
+ },
+ "Russian Standard Time": {
+ "aliasTo": "Europe/Moscow"
+ },
+ "SA Eastern Standard Time": {
+ "aliasTo": "America/Cayenne"
+ },
+ "SA Pacific Standard Time": {
+ "aliasTo": "America/Bogota"
+ },
+ "SA Western Standard Time": {
+ "aliasTo": "America/La_Paz"
+ },
+ "SE Asia Standard Time": {
+ "aliasTo": "Asia/Bangkok"
+ },
+ "Samoa Standard Time": {
+ "aliasTo": "Pacific/Apia"
+ },
+ "Singapore Standard Time": {
+ "aliasTo": "Asia/Singapore"
+ },
+ "South Africa Standard Time": {
+ "aliasTo": "Africa/Johannesburg"
+ },
+ "Sri Lanka Standard Time": {
+ "aliasTo": "Asia/Colombo"
+ },
+ "Syria Standard Time": {
+ "aliasTo": "Asia/Damascus"
+ },
+ "Taipei Standard Time": {
+ "aliasTo": "Asia/Taipei"
+ },
+ "Tasmania Standard Time": {
+ "aliasTo": "Australia/Hobart"
+ },
+ "Tokyo Standard Time": {
+ "aliasTo": "Asia/Tokyo"
+ },
+ "Tonga Standard Time": {
+ "aliasTo": "Pacific/Tongatapu"
+ },
+ "Turkey Standard Time": {
+ "aliasTo": "Europe/Istanbul"
+ },
"UCT": {
"aliasTo": "UTC"
},
+ "US Eastern Standard Time": {
+ "aliasTo": "America/Indianapolis"
+ },
+ "US Mountain Standard Time": {
+ "aliasTo": "America/Phoenix"
+ },
+ "Ulaanbaatar Standard Time": {
+ "aliasTo": "Asia/Ulaanbaatar"
+ },
"Universal": {
"aliasTo": "UTC"
},
+ "Venezuela Standard Time": {
+ "aliasTo": "America/Caracas"
+ },
+ "Vladivostok Standard Time": {
+ "aliasTo": "Asia/Vladivostok"
+ },
+ "W. Australia Standard Time": {
+ "aliasTo": "Australia/Perth"
+ },
+ "W. Central Africa Standard Time": {
+ "aliasTo": "Africa/Lagos"
+ },
+ "W. Europe Standard Time": {
+ "aliasTo": "Europe/Berlin"
+ },
+ "West Asia Standard Time": {
+ "aliasTo": "Asia/Tashkent"
+ },
+ "West Pacific Standard Time": {
+ "aliasTo": "Pacific/Port_Moresby"
+ },
+ "Yakutsk Standard Time": {
+ "aliasTo": "Asia/Yakutsk"
+ },
"Z": {
"aliasTo": "UTC"
},
@@ -1207,7 +1504,7 @@
"longitude": "+1132800"
},
"Asia/Choibalsan": {
- "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Choibalsan\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD\r\nEND:VTIMEZONE",
+ "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Choibalsan\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0900\r\nTZNAME:CHOST\r\nDTSTART:19700328T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0800\r\nTZNAME:CHOT\r\nDTSTART:19700926T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SA\r\nEND:STANDARD\r\nEND:VTIMEZONE",
"latitude": "+0480400",
"longitude": "+1143000"
},
@@ -1242,12 +1539,12 @@
"longitude": "+0684800"
},
"Asia/Gaza": {
- "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Gaza\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700326T235959\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19700925T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYMONTHDAY=21,22,23,24,25,26,27;BYDAY=FR\r\nEND:STANDARD\r\nEND:VTIMEZONE",
+ "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Gaza\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701023T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYMONTHDAY=21,22,23,24,25,26,27;BYDAY=FR\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700327T235959\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE",
"latitude": "+0313000",
"longitude": "+0342800"
},
"Asia/Hebron": {
- "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Hebron\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700326T235959\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19700925T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYMONTHDAY=21,22,23,24,25,26,27;BYDAY=FR\r\nEND:STANDARD\r\nEND:VTIMEZONE",
+ "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Hebron\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701023T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYMONTHDAY=21,22,23,24,25,26,27;BYDAY=FR\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700327T235959\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE",
"latitude": "+0313200",
"longitude": "+0350542"
},
@@ -1262,7 +1559,7 @@
"longitude": "+1140900"
},
"Asia/Hovd": {
- "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Hovd\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:HOVT\r\nDTSTART:19700101T000000\r\nEND:STANDARD\r\nEND:VTIMEZONE",
+ "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Hovd\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0800\r\nTZNAME:HOVST\r\nDTSTART:19700328T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0700\r\nTZNAME:HOVT\r\nDTSTART:19700926T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SA\r\nEND:STANDARD\r\nEND:VTIMEZONE",
"latitude": "+0480100",
"longitude": "+0913900"
},
@@ -1487,7 +1784,7 @@
"longitude": "+1394441"
},
"Asia/Ulaanbaatar": {
- "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Ulaanbaatar\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:ULAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD\r\nEND:VTIMEZONE",
+ "ics": "BEGIN:VTIMEZONE\r\nTZID:Asia/Ulaanbaatar\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0900\r\nTZNAME:ULAST\r\nDTSTART:19700328T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0800\r\nTZNAME:ULAT\r\nDTSTART:19700926T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SA\r\nEND:STANDARD\r\nEND:VTIMEZONE",
"latitude": "+0475500",
"longitude": "+1065300"
},
diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/chat/protocols/twitter/twitter.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/chat/protocols/twitter/twitter.js
--- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/chat/protocols/twitter/twitter.js 2015-04-22 13:03:31.000000000 +0000
+++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/chat/protocols/twitter/twitter.js 2015-04-24 19:30:10.000000000 +0000
@@ -863,9 +863,16 @@
Services.obs.notifyObservers(this._browserRequest, "browser-request", null);
},
finishAuthorizationRequest: function() {
+ // Clean up the cookies, so that several twitter OAuth dialogs can work
+ // during the same session (bug 954308).
+ let cookies = Services.cookies.getCookiesFromHost("twitter.com");
+ while (cookies.hasMoreElements()) {
+ let cookie = cookies.getNext().QueryInterface(Ci.nsICookie2);
+ Services.cookies.remove(cookie.host, cookie.name, cookie.path, false);
+ }
+
if (!("_browserRequest" in this))
return;
-
this._browserRequest._active = false;
if ("_listener" in this._browserRequest)
this._browserRequest._listener._cleanUp();
diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/chat/protocols/xmpp/xmpp-session.jsm thunderbird-trunk-40.0~a1~hg20150424r17837.240895/chat/protocols/xmpp/xmpp-session.jsm
--- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/chat/protocols/xmpp/xmpp-session.jsm 2015-04-22 13:03:31.000000000 +0000
+++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/chat/protocols/xmpp/xmpp-session.jsm 2015-04-24 19:30:10.000000000 +0000
@@ -68,6 +68,25 @@
Stanza.node("ping", Stanza.NS.ping)),
this.cancelDisconnectTimer, this);
},
+ _lastReceiveTime: 0,
+ _lastSendTime: 0,
+ checkPingTimer(aJustSentSomething = false) {
+ // Don't start a ping timer if we're not fully connected yet.
+ if (this.onXmppStanza != this.stanzaListeners.accountListening)
+ return;
+ let now = Date.now();
+ if (aJustSentSomething)
+ this._lastSendTime = now;
+ else
+ this._lastReceiveTime = now;
+ // We only cancel the ping timer if we've both received and sent
+ // something in the last two minutes. This is because Openfire
+ // servers will disconnect us if we don't send anything for a
+ // couple of minutes.
+ if (Math.min(this._lastSendTime, this._lastReceiveTime) >
+ now - this.kTimeBeforePing)
+ this.resetPingTimer();
+ },
get DEBUG() this._account.DEBUG,
get LOG() this._account.LOG,
@@ -112,6 +131,7 @@
if (aCallback)
this._handlers.set(aStanza.attributes.id, aCallback.bind(aThis));
this.send(aStanza.getXML());
+ this.checkPingTimer(true);
return aStanza.attributes.id;
},
@@ -174,8 +194,7 @@
/* When incoming data is available to be parsed */
onDataReceived: function(aData) {
- if (this.onXmppStanza == this.stanzaListeners.accountListening)
- this.resetPingTimer();
+ this.checkPingTimer();
let istream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
istream.setData(aData, aData.length);
diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/debian/changelog thunderbird-trunk-40.0~a1~hg20150424r17837.240895/debian/changelog
--- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/debian/changelog 2015-04-22 15:15:32.000000000 +0000
+++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/debian/changelog 2015-04-24 20:09:23.000000000 +0000
@@ -1,4 +1,4 @@
-thunderbird-trunk (40.0~a1~hg20150421r17821.240313-0ubuntu1~umd1~utopic) utopic; urgency=medium
+thunderbird-trunk (40.0~a1~hg20150424r17837.240895-0ubuntu1~umd1~utopic) utopic; urgency=medium
* Refresh patches
- update debian/patches/unity-menubar.patch
@@ -11,7 +11,7 @@
* Don't build with --enable-tests when the tests aren't enabled
- update debian/config/mozconfig.in
- -- Chris Coulson
Il responsabile di un sito web segnalato nell’elenco dei siti pericolosi, nel caso ritenesse tale segnalazione errata, può chiedere una nuova valutazione.
"> + +Questo tipo di siti cerca di installare programmi che possono risultare ingannevoli e avere conseguenze inaspettate sul sistema. +"> L’inserimento di informazioni personali in questa pagina può dare origine a furti d’identità o altre frodi. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/toolkit/chrome/global/aboutServiceWorkers.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/toolkit/chrome/global/aboutServiceWorkers.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/toolkit/chrome/global/aboutServiceWorkers.properties 2015-04-22 13:08:47.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/toolkit/chrome/global/aboutServiceWorkers.properties 2015-04-24 19:32:36.000000000 +0000 @@ -15,3 +15,4 @@ unregister = Deregistra waiting = In attesa… unregisterError = Deregistrazione del Service worker non riuscita. +pushEndpoint = Endpoint push: diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/toolkit/chrome/global/aboutSupport.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/toolkit/chrome/global/aboutSupport.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/toolkit/chrome/global/aboutSupport.properties 2015-04-22 13:08:47.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/toolkit/chrome/global/aboutSupport.properties 2015-04-24 19:32:36.000000000 +0000 @@ -46,6 +46,7 @@ canSandboxMedia = Sandbox plugin multimediali multiProcessStatus = %1$S/%2$S (predefinito: %3$S) asyncPanZoom = Panoramica/zoom asincroni (APZ) +apzNone = nessuno wheelEnabled = input rotella attivo touchEnabled = input touch attivo wheelWarning = input rotella asincrono disattivato a causa di una preferenza non supportata: %S diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/toolkit/chrome/places/places.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/toolkit/chrome/places/places.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/toolkit/chrome/places/places.properties 2015-04-22 13:08:47.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/toolkit/chrome/places/places.properties 2015-04-24 19:32:36.000000000 +0000 @@ -16,4 +16,3 @@ finduri-MonthYear = %1$S %2$S localhost = (file locali) backupFileSizeText = %1$S %2$S -windows8TouchTitle = Windows 8 Touch diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/webapprt/webapprt/overrides/appstrings.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/webapprt/webapprt/overrides/appstrings.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/it/webapprt/webapprt/overrides/appstrings.properties 2015-04-22 13:08:47.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/it/webapprt/webapprt/overrides/appstrings.properties 2015-04-24 19:32:36.000000000 +0000 @@ -28,6 +28,7 @@ externalProtocolChkMsg = Ricorda la scelta effettuata per tutti i link di questo tipo. externalProtocolLaunchBtn = Avvia applicazione malwareBlocked = Il sito web %S è stato segnalato come sito web malevolo ed è stato bloccato sulla base delle impostazioni di sicurezza. +unwantedBlocked = Il sito web %S è stato segnalato come un sito contenente software indesiderato ed è stato bloccato sulla base delle impostazioni di sicurezza. phishingBlocked = Il sito web %S è stato segnalato come sito contraffatto, realizzato per indurre gli utenti a rivelare informazioni personali o finanziarie. cspBlocked = Tentativo da parte dell’applicazione di accedere a una risorsa con criteri sulla sicurezza dei contenuti che ne impediscono il caricamento con questa modalità. corruptedContentError = Impossibile continuare il caricamento dell’applicazione a causa di un errore rilevato durante la trasmissione dei dati. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/dom/chrome/dom/dom.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/dom/chrome/dom/dom.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/dom/chrome/dom/dom.properties 2015-04-22 13:09:33.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/dom/chrome/dom/dom.properties 2015-04-24 19:32:55.000000000 +0000 @@ -149,4 +149,4 @@ XMLDocumentLoadPrincipalMismatch=Użycie metody „document.load” jest zabronione dla dokumentów pochodzących z innych okien. Wyłącznie w oknie, w którym dokument został utworzony, można wykonać „.load” dla tego dokumentu. Zamiast tej metody, lepiej używać „XMLHttpRequest”. IndexedDBTransactionAbortNavigation=Nieukończona transakcja IndexedDB została przerwana przez nawigację. WillChangeBudgetWarning=Użycie pamięci przez własność „will-change” jest zbyt wysokie. Powierzchnia pokrywa %1$S pikseli, budżet jest powierzchnią dokumentu pomnożoną przez %2$S (%3$S pikseli). Wszystkie wystąpienia „will-change” w dokumencie będą ignorowane, gdy budżet zostanie przekroczony. -HittingMaxWorkersPerDomain=ServiceWorker nie mógł zostać uruchomiony natychmiast, ponieważ inne dokumenty tego samego pochodzenia wyczerpują ich limit. ServiceWorker został skolejkowany i zostanie uruchomiony, gdy inne zakończą swoje działanie. +HittingMaxWorkersPerDomain=Service worker nie mógł zostać uruchomiony natychmiast, ponieważ inne dokumenty tego samego pochodzenia wyczerpują ich limit, został skolejkowany i zostanie uruchomiony, gdy inne zakończą swoje działanie. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.dtd 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.dtd 2015-04-24 19:32:55.000000000 +0000 @@ -0,0 +1,8 @@ + + + + + + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.properties 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/global/aboutServiceWorkers.properties 2015-04-24 19:32:55.000000000 +0000 @@ -0,0 +1,13 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +title=Źródło: %S +b2gtitle=Firefox OS AppID %S - InBrowserElement %S +scope=Zakres: +scriptSpec=Specyfikacja skryptu: +currentWorkerURL=Aktualny adres URL workera: +activeCacheName=Aktywna pamięć podręczna: +waitingCacheName=Oczekująca pamięć podręczna: +true=true +false=false diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/global/aboutSupport.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/global/aboutSupport.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/global/aboutSupport.dtd 2015-04-22 13:09:32.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/global/aboutSupport.dtd 2015-04-24 19:32:55.000000000 +0000 @@ -53,6 +53,7 @@ + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/mozapps/extensions/extensions.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/mozapps/extensions/extensions.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/pl/toolkit/chrome/mozapps/extensions/extensions.dtd 2015-04-22 13:09:32.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/pl/toolkit/chrome/mozapps/extensions/extensions.dtd 2015-04-24 19:32:55.000000000 +0000 @@ -104,6 +104,7 @@ + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/chat/xmpp.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/chat/xmpp.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/chat/xmpp.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/chat/xmpp.properties 2015-04-24 19:33:21.000000000 +0000 @@ -68,6 +68,14 @@ chatRoomField.nick=_Rumuz chatRoomField.password=_Parola +# LOCALIZATION NOTE (conversation.muc.*): +# These are displayed as a system message when a chatroom invitation is +# received. +# %1$S is the inviter. +# %2$S is the room. +# %3$S is the reason which is a message provided by the person sending the +# invitation. + # LOCALIZATION NOTE (options.*): # These are the protocol specific options shown in the account manager and # account wizard windows. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/accessibility/mac/accessible.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/accessibility/mac/accessible.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/accessibility/mac/accessible.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/accessibility/mac/accessible.properties 2015-04-24 19:33:21.000000000 +0000 @@ -25,6 +25,8 @@ # The Role Description for definition list dl, dt and dd term = terim definition = tanım +# The Role Description for an input type="search" text field +searchTextField = arama metni alanı # The Role Description for WAI-ARIA Landmarks search = arama banner = banner diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/dom/dom.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/dom/dom.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/dom/dom.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/dom/dom.properties 2015-04-24 19:33:21.000000000 +0000 @@ -153,8 +153,6 @@ ImplicitMetaViewportTagFallback=meta-viewport etiketi bulunamadı. Gelecek sürümlerde beklenmedik davranışsal değişiklikleri önlemek için lütfen bu etiketi tanımlayın. Daha fazla yardım için: https://developer.mozilla.org/tr/docs/Mozilla/Mobile/Viewport_meta_tag # LOCALIZATION NOTE: Do not translate "DataContainerEvent" or "CustomEvent" DataContainerEventWarning=DataContainerEvent kullanımı eskimiştir. Onun yerine CustomEvent kullanın. -# LOCALIZATION NOTE: Do not translate "sendAsBinary" or "send(Blob data)" -SendAsBinaryWarning=Standart dışı sendAsBinary yönetimi eskimiştir ve yakında kaldırılacaktır. Onun yerine standart send(Blob data) yöntemini kullanın. # LOCALIZATION NOTE: Do not translate "window.controllers" Window_ControllersWarning=window.controllers eskimiştir. UA tespiti için kullanmayın. ImportXULIntoContentWarning=XUL düğümlerini içerik belgesine aktarmak eskimiştir. Bu işlev yakında kaldırılacaktır. @@ -163,3 +161,5 @@ IndexedDBTransactionAbortNavigation=Henüz tamamlanmamış bir IndexedDB işlemi, sayfa gezintisi nedeniyle iptal edildi. # LOCALIZATION NOTE (WillChangeBudgetWarning): Do not translate Will-change, %1$S,%2$S,%3$S are numbers. WillChangeBudgetWarning=Will-change bellek tüketimi çok yüksek. Yüzey alanı %1$S pikseli kaplıyor, bütçe ise %2$S ile çarpılmış belge yüzeyi alanıdır (%3$S piksel). Bütçe aşılırsa belgedeki tüm will-change değerleri görmezden gelinir. +# LOCALIZATION NOTE: Do not translate "ServiceWorker". +HittingMaxWorkersPerDomain=Bir ServiceWorker hemen başlatılamadı çünkü aynı kökendeki diğer belgeler zaten maksimum işçi sayısını kullanıyor. ServiceWorker sıraya alındı ve diğer işçilerden bazılarının işi bittikten sonra başlatılacak. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/plugins.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/plugins.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/plugins.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/plugins.properties 2015-04-24 19:33:21.000000000 +0000 @@ -19,12 +19,13 @@ mimetype_label=MIME Türü description_label=Tanım suffixes_label=Son ekler +learn_more_label=Daha fazla bilgi # GMP Plugins gmp_license_info=Lisans bilgileri openH264_name=OpenH264 Video Çözücü (Cisco Systems, Inc. tarafından sağlanmaktadır) -openH264_description=Web videolarını oynatın ve video sohbetlere katılın. +openH264_description2=Bu yan uygulama, WebRTC şartnamesine uyum sağlamak ve H.264 video çözücüye ihtiyaç duyan cihazlarda WebRTC görüşmeleri yapabilmek amacıyla Mozilla tarafından otomatik yüklenir. Çözücünün kaynak kodlarını görmek ve daha bilgi almak için http://www.openh264.org/ adresini ziyaret edin. eme-adobe_name=Primetime İçerik Çözme Modülü (Adobe Systems, Incorporated tarafından sağlanmaktadır) eme-adobe_description=Korumalı web videolarını oynatır. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/security/caps.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/security/caps.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/security/caps.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/security/caps.properties 2015-04-24 19:33:21.000000000 +0000 @@ -4,6 +4,7 @@ CheckMessage = Bu kararı hatırla CheckLoadURIError = Güvenlik hatası: %S içeriği %S yükleyemez veya başka yere bağlanamaz. CheckSameOriginError = Güvenlik hatası: %S içeriği %S üzerinden veri yükleyemez. +ExternalDataError = Güvenlik hatası: %S üzerindeki içerik %S yüklemeye çalıştı ama içerik resim olarak kullanıldığında dışarıdan veri yükleyemez.\u00A0 # LOCALIZATION NOTE (GetPropertyDeniedOrigins): # %1$S is the origin of the script which was denied access. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/security/security.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/security/security.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/dom/chrome/security/security.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/dom/chrome/security/security.properties 2015-04-24 19:33:21.000000000 +0000 @@ -5,6 +5,17 @@ # CORS # LOCALIZATION NOTE: Do not translate "Access-Control-Allow-Origin", Access-Control-Allow-Credentials, Access-Control-Allow-Methods, Access-Control-Allow-Headers +CORSDisabled=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS devre dışı.) +CORSRequestFailed=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS isteği başarısız oldu.) +CORSRequestNotHttp=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS isteği http değil.) +CORSMissingAllowOrigin=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi 'Access-Control-Allow-Origin' eksik.) +CORSAllowOriginNotMatchingOrigin=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi 'Access-Control-Allow-Origin', '%2$S' ile eşleşmiyor.) +CORSMethodNotFound=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi 'Access-Control-Allow-Methods'ta metot bulunamadı.) +CORSMissingAllowCredentials=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi 'Access-Control-Allow-Credentials'ta 'true' bekleniyordu.) +CORSPreflightDidNotSucceed=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS başlatma kanalı başarısız oldu.) +CORSInvalidAllowMethod=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi 'Access-Control-Allow-Methods'ta geçersiz '%2$S' jetonu.) +CORSInvalidAllowHeader=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi 'Access-Control-Allow-Headers'ta geçersiz '%2$S' jetonu.) +CORSMissingAllowHeaderFromPreflight=Çapraz köken isteği engellendi: Aynı Köken İlkesi, %1$S üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS başlangıç kanalındaki CORS üstbilgisi 'Access-Control-Allow-Headers'ta geçersiz '%2$S' jetonu.) # LOCALIZATION NOTE: Do not translate "Strict-Transport-Security" or "HSTS" InvalidSTSHeaders=Site geçersiz bir Strict-Transport-Security üstbilgisi belirtti. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/editor/ui/chrome/composer/editingOverlay.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/editor/ui/chrome/composer/editingOverlay.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/editor/ui/chrome/composer/editingOverlay.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/editor/ui/chrome/composer/editingOverlay.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -15,8 +15,8 @@ - - + + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/editor/ui/chrome/dialogs/EditorSaveAsCharset.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/editor/ui/chrome/dialogs/EditorSaveAsCharset.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/editor/ui/chrome/dialogs/EditorSaveAsCharset.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/editor/ui/chrome/dialogs/EditorSaveAsCharset.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -4,12 +4,8 @@ + - - - - - diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/am-server-top.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/am-server-top.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/am-server-top.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/am-server-top.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -74,7 +74,7 @@ - + @@ -86,5 +86,5 @@ - + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/folderProps.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/folderProps.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/folderProps.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/folderProps.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -5,17 +5,17 @@ - - - - + + + + - + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/messengercompose/composeMsgs.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/messengercompose/composeMsgs.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/messengercompose/composeMsgs.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/messengercompose/composeMsgs.properties 2015-04-24 19:33:21.000000000 +0000 @@ -86,14 +86,11 @@ ## LOCALIZATION NOTE (smtpSendFailedUnknownReason): argument %S is the Outgoing server (SMTP) smtpSendFailedUnknownReason=İleti bilinmeyen bir sebepten ötürü %S Gönderme Sunucusu (SMTP) kullanılarak gönderilemedi. Gönderme Sunucusu (SMTP) ayarlarınızın doğruluğunu kontrol edip yeniden deneyin. -# LOCALIZATION NOTE (smtpAuthChangeEncryptToPlainNoSsl): %S is the server hostname -smtpAuthChangeEncryptToPlainNoSsl=%S Gönderme Sunucusu (SMTP)'nun şifrelenmiş parolaları desteklemediği görülüyor. Hesabı yeni eklediyseniz Hesap Ayarları'ndaki Sunucu Ayarları'nda yer alan Yetkilendirme Yöntemi'ni "Parola, güvensiz aktarım" olarak değiştirin. Eskiden işe yarıyor da şimdi yaramıyorsa, parolanızın çalınmış olduğundan şüphelenebilirsiniz. +# LOCALIZATION NOTE (smtpHintAuthEncryptToPlainNoSsl): %S is the server hostname -# LOCALIZATION NOTE (smtpAuthChangeEncryptToPlainSsl): %S is the server hostname -smtpAuthChangeEncryptToPlainSsl=%S Gönderme Sunucusu (SMTP)'nun şifrelenmiş parolaları desteklemediği görülüyor. Hesabı yeni eklediyseniz Hesap Ayarları'ndaki Sunucu Ayarları'nda yer alan Yetkilendirme Yöntemi'ni 'Normal parola' olarak değiştirin. +# LOCALIZATION NOTE (smtpHintAuthEncryptToPlainSsl): %S is the server hostname -# LOCALIZATION NOTE (smtpAuthChangePlainToEncrypt): %S is the server hostname -smtpAuthChangePlainToEncrypt=%S Gönderme Sunucusu (SMTP) düz metin olarak girilen parolaları desteklemiyor. Lütfen Hesap Ayarları'ndaki Sunucu Ayarları'nda yer alan Yetkilendirme Yöntemi'ni "Şifrelenmiş parola" olarak değiştirin. +# LOCALIZATION NOTE (smtpHintAuthPlainToEncrypt): %S is the server hostname # LOCALIZATION NOTE (smtpAuthFailure): %S is the server hostname smtpAuthFailure=%S Gönderme Sunucusu (SMTP)'nda yetkilendirme sağlanamadı. Lütfen parolayı kontrol edin ve Hesap Ayarları'ndaki Sunucu Ayarları'nda yer alan Yetkilendirme Yöntemi'ni doğrulayın. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/messenger.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/messenger.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/messenger.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/messenger.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -192,6 +192,8 @@ + + @@ -658,6 +660,7 @@ + @@ -680,6 +683,7 @@ + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/preferences/advanced.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/preferences/advanced.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/preferences/advanced.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/preferences/advanced.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -16,7 +16,7 @@ - + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/preferences/fonts.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/preferences/fonts.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/preferences/fonts.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/preferences/fonts.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -8,8 +8,8 @@ - - + + @@ -20,20 +20,16 @@ - - - + - - - - + @@ -48,8 +44,12 @@ - + + + + + @@ -68,10 +68,10 @@ - - + + - - + + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/SearchDialog.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/SearchDialog.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/mail/chrome/messenger/SearchDialog.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/mail/chrome/messenger/SearchDialog.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -40,6 +40,7 @@ + @@ -61,6 +62,7 @@ + diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pipnss/nsserrors.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pipnss/nsserrors.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pipnss/nsserrors.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pipnss/nsserrors.properties 2015-04-24 19:33:21.000000000 +0000 @@ -317,3 +317,4 @@ MOZILLA_PKIX_ERROR_V1_CERT_USED_AS_CA=Sunucu sertifikasının yayımlanması için güvenilir öğe olmayan bir X.509 sürüm 1 sertifikası kullanıldı. X.509 sürüm 1 sertifikaları eskimiştir ve diğer sertifikaları imzalamak için kullanılmamalıdır. MOZILLA_PKIX_ERROR_NOT_YET_VALID_CERTIFICATE=Sunucu, henüz geçerli olmayan bir sertifika sundu. MOZILLA_PKIX_ERROR_NOT_YET_VALID_ISSUER_CERTIFICATE=Bu sunucunun sertifikasını yayımlamak için henüz geçerli olmayan bir sertifika kullanılmış. +MOZILLA_PKIX_ERROR_SIGNATURE_ALGORITHM_MISMATCH=Sertifikanın imza alanındaki imza algoritması, signatureAlgorithm alanındaki algoritmayla eşleşmiyor. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pipnss/pipnss.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pipnss/pipnss.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pipnss/pipnss.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pipnss/pipnss.properties 2015-04-24 19:33:21.000000000 +0000 @@ -268,6 +268,8 @@ certErrorTrust_SelfSigned=Bu sertifika kendi kendine imzalandığı için sertifikaya güvenilmiyor. certErrorTrust_UnknownIssuer=Sertifikaya güvenilmiyor çünkü yayıncısının sertfikası tanınmıyor. +certErrorTrust_UnknownIssuer2=Sunucu uygun aracı sertifikaları göndermiyor olabilir. +certErrorTrust_UnknownIssuer3=Ek bir kök sertifikasının içe alınması gerekebilir. certErrorTrust_CaInvalid=Sertifikaya güvenilmiyor çünkü geçersiz bir sertifika makamı sertifikası tarafından verilmiş. certErrorTrust_Issuer=Yayıncısının sertifikasına güvenilmediği için bu sertifikaya güvenilmiyor. certErrorTrust_SignatureAlgorithmDisabled=Güvenli olmadığı için devre dışı bırakılmış bir imza algoritması ile imzalandığından, bu sertifikaya güvenilmiyor. diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pippki/certManager.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pippki/certManager.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pippki/certManager.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pippki/certManager.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -39,10 +39,6 @@ - - - - @@ -61,8 +57,6 @@ - - diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pippki/pippki.dtd thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pippki/pippki.dtd --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pippki/pippki.dtd 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pippki/pippki.dtd 2015-04-24 19:33:21.000000000 +0000 @@ -14,11 +14,6 @@ - - - - - @@ -49,13 +44,6 @@ - - - - - - - diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pippki/pippki.properties thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pippki/pippki.properties --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/l10n/tr/security/manager/chrome/pippki/pippki.properties 2015-04-22 13:10:37.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/l10n/tr/security/manager/chrome/pippki/pippki.properties 2015-04-24 19:33:21.000000000 +0000 @@ -12,11 +12,6 @@ #For editing cert trust editTrustCA="%S" sertifikası bir Sertifika Makamını temsil ediyor. -editTrustEmail="%S" sertifikasını yayımlayan: -issuerNotTrusted=Bu sertifikayı yayımlayan sertifika makamına güvenmediğiniz için, burada aksi belirtilmediği sürece, bu sertifikanın doğruluğuna da güvenmiyorsunuz. -issuerTrusted=Bu sertifikayı yayımlayan sertifika makamına güvendiğiniz için, burada aksi belirtilmediği sürece, bu sertifikanın doğruluğuna da güveniyorsunuz. -issuerNotKnown=Bu sertifikayı yayımlayan sertifika makamını tanımadığınız için, burada aksi belirtilmediği sürece, bu sertifikanın doğruluğuna da güvenmiyorsunuz. -issuerCertNotFound=Bu sertifika makamının sertifikası bulunamadı #For Deleting Certificates deleteSslCertConfirm3=Bu sunucu istisnalarını silmek istediğinizden emin misiniz? @@ -74,14 +69,12 @@ pageInfo_Privacy_Encrypted1=Bu sayfa size ulaşmadan önce şifrelendi. pageInfo_Privacy_Encrypted2=Şifreleme, bilgisayarlar arasındaki bilgi alışverişinin yetkisi olmayan üçüncü kişilerce görülmesini zorlaştırır. Dolayısıyla açtığınız bu sayfanın ağ üzerinde dolaşırken birileri tarafından görülme olasılığı çok azdır. pageInfo_MixedContent=Bağlantı kısmen şifrelenmiş -pageInfo_Privacy_Broken1=Görüntülediğiniz sayfanın bazı kısımları, internet üzerinden aktarılmadan önce şifrelenmemiş veya şifreleme yeterince güçlü değil. +pageInfo_Privacy_Broken2=Görüntülediğiniz sayfanın bazı kısımları, internet üzerinden aktarılmadan önce şifrelenmemiş veya şifreleme yeterince güçlü değil. #Cert Viewer certDetails=Sertifika görüntüleyicisi: notPresent=Exec: ${name} | ' + + '||
---|---|---|
${key} | ' + + '= | ' + + '${args[key]} | ' + + '
' + html + '' - }; + from: 'testCommandOutput', + to: 'string', + exec: function(testCommandOutput, context) { + var argsOut = Object.keys(testCommandOutput.args).map(function(key) { + return key + '=' + testCommandOutput.args[key]; + }).join(' '); + return 'Exec: ' + testCommandOutput.name + ' ' + argsOut; } }, { @@ -508,7 +551,7 @@ exec: function(args, context) { if (args.method === 'reject') { return new Promise(function(resolve, reject) { - setTimeout(function() { + context.environment.window.setTimeout(function() { reject('rejected promise'); }, 10); }); @@ -516,7 +559,7 @@ if (args.method === 'rejecttyped') { return new Promise(function(resolve, reject) { - setTimeout(function() { + context.environment.window.setTimeout(function() { reject(context.typedData('number', 54)); }, 10); }); @@ -524,7 +567,7 @@ if (args.method === 'throwinpromise') { return new Promise(function(resolve, reject) { - setTimeout(function() { + context.environment.window.setTimeout(function() { resolve('should be lost'); }, 10); }).then(function() { @@ -655,7 +698,7 @@ name: 'selection', data: function(context) { return new Promise(function(resolve, reject) { - setTimeout(function() { + context.environment.window.setTimeout(function() { resolve([ 'Shalom', 'Namasté', 'Hallo', 'Dydd-da', 'Chào', 'Hej', 'Saluton', 'Sawubona' @@ -738,5 +781,16 @@ exec: function(args, context) { return args; } + }, + { + item: 'command', + name: 'tsres', + params: [ + { + name: 'resource', + type: 'resource' + } + ], + exec: createExec('tsres'), } ]; diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/debugger/debugger-commands.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/debugger/debugger-commands.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/debugger/debugger-commands.js 2015-04-22 13:05:25.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/debugger/debugger-commands.js 2015-04-24 19:30:56.000000000 +0000 @@ -5,7 +5,7 @@ "use strict"; const { Cc, Ci, Cu } = require("chrome"); -const gcli = require("gcli/index"); +const l10n = require("gcli/l10n"); loader.lazyImporter(this, "gDevTools", "resource:///modules/devtools/gDevTools.jsm"); @@ -67,8 +67,8 @@ */ exports.items.push({ name: "break", - description: gcli.lookup("breakDesc"), - manual: gcli.lookup("breakManual") + description: l10n.lookup("breakDesc"), + manual: l10n.lookup("breakManual") }); /** @@ -76,7 +76,9 @@ */ exports.items.push({ name: "break list", - description: gcli.lookup("breaklistDesc"), + item: "command", + runAt: "client", + description: l10n.lookup("breaklistDesc"), returnType: "breakpoints", exec: function(args, context) { let dbg = getPanel(context, "jsdebugger", { ensureOpened: true }); @@ -102,7 +104,7 @@ } else { return context.createView({ html: "
${message}
", - data: { message: gcli.lookup("breaklistNone") } + data: { message: l10n.lookup("breaklistNone") } }); } } @@ -126,7 +128,7 @@ " data-command='break del ${breakpoint.label}'" + " onclick='${onclick}'" + " ondblclick='${ondblclick}'>" + - " " + gcli.lookup("breaklistOutRemove") + "" + + " " + l10n.lookup("breaklistOutRemove") + "" + " " + " " + " " + @@ -141,16 +143,18 @@ */ exports.items.push({ name: "break add", - description: gcli.lookup("breakaddDesc"), - manual: gcli.lookup("breakaddManual") + description: l10n.lookup("breakaddDesc"), + manual: l10n.lookup("breakaddManual") }); /** * 'break add line' command */ exports.items.push({ + item: "command", + runAt: "client", name: "break add line", - description: gcli.lookup("breakaddlineDesc"), + description: l10n.lookup("breakaddlineDesc"), params: [ { name: "file", @@ -160,19 +164,19 @@ return getAllSources(getPanel(context, "jsdebugger")); } }, - description: gcli.lookup("breakaddlineFileDesc") + description: l10n.lookup("breakaddlineFileDesc") }, { name: "line", type: { name: "number", min: 1, step: 10 }, - description: gcli.lookup("breakaddlineLineDesc") + description: l10n.lookup("breakaddlineLineDesc") } ], returnType: "string", exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerStopped"); + return l10n.lookup("debuggerStopped"); } let deferred = context.defer(); @@ -182,9 +186,9 @@ let position = { actor: item.value, line: args.line }; dbg.addBreakpoint(position).then(() => { - deferred.resolve(gcli.lookup("breakaddAdded")); + deferred.resolve(l10n.lookup("breakaddAdded")); }, aError => { - deferred.resolve(gcli.lookupFormat("breakaddFailed", [aError])); + deferred.resolve(l10n.lookupFormat("breakaddFailed", [aError])); }); return deferred.promise; @@ -195,8 +199,10 @@ * 'break del' command */ exports.items.push({ + item: "command", + runAt: "client", name: "break del", - description: gcli.lookup("breakdelDesc"), + description: l10n.lookup("breakdelDesc"), params: [ { name: "breakpoint", @@ -214,14 +220,14 @@ })); } }, - description: gcli.lookup("breakdelBreakidDesc") + description: l10n.lookup("breakdelBreakidDesc") } ], returnType: "string", exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerStopped"); + return l10n.lookup("debuggerStopped"); } let source = dbg._view.Sources.getItemForAttachment(a => { @@ -233,9 +239,9 @@ line: args.breakpoint.lineNumber }; dbg.removeBreakpoint(position).then(() => { - deferred.resolve(gcli.lookup("breakdelRemoved")); + deferred.resolve(l10n.lookup("breakdelRemoved")); }, () => { - deferred.resolve(gcli.lookup("breakNotFound")); + deferred.resolve(l10n.lookup("breakNotFound")); }); return deferred.promise; @@ -247,16 +253,18 @@ */ exports.items.push({ name: "dbg", - description: gcli.lookup("dbgDesc"), - manual: gcli.lookup("dbgManual") + description: l10n.lookup("dbgDesc"), + manual: l10n.lookup("dbgManual") }); /** * 'dbg open' command */ exports.items.push({ + item: "command", + runAt: "client", name: "dbg open", - description: gcli.lookup("dbgOpen"), + description: l10n.lookup("dbgOpen"), params: [], exec: function(args, context) { let target = context.environment.target; @@ -268,8 +276,10 @@ * 'dbg close' command */ exports.items.push({ + item: "command", + runAt: "client", name: "dbg close", - description: gcli.lookup("dbgClose"), + description: l10n.lookup("dbgClose"), params: [], exec: function(args, context) { if (!getPanel(context, "jsdebugger")) { @@ -284,13 +294,15 @@ * 'dbg interrupt' command */ exports.items.push({ + item: "command", + runAt: "client", name: "dbg interrupt", - description: gcli.lookup("dbgInterrupt"), + description: l10n.lookup("dbgInterrupt"), params: [], exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerStopped"); + return l10n.lookup("debuggerStopped"); } let controller = dbg._controller; @@ -305,13 +317,15 @@ * 'dbg continue' command */ exports.items.push({ + item: "command", + runAt: "client", name: "dbg continue", - description: gcli.lookup("dbgContinue"), + description: l10n.lookup("dbgContinue"), params: [], exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerStopped"); + return l10n.lookup("debuggerStopped"); } let controller = dbg._controller; @@ -326,22 +340,26 @@ * 'dbg step' command */ exports.items.push({ + item: "command", + runAt: "client", name: "dbg step", - description: gcli.lookup("dbgStepDesc"), - manual: gcli.lookup("dbgStepManual") + description: l10n.lookup("dbgStepDesc"), + manual: l10n.lookup("dbgStepManual") }); /** * 'dbg step over' command */ exports.items.push({ + item: "command", + runAt: "client", name: "dbg step over", - description: gcli.lookup("dbgStepOverDesc"), + description: l10n.lookup("dbgStepOverDesc"), params: [], exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerStopped"); + return l10n.lookup("debuggerStopped"); } let controller = dbg._controller; @@ -356,13 +374,15 @@ * 'dbg step in' command */ exports.items.push({ + item: "command", + runAt: "client", name: 'dbg step in', - description: gcli.lookup("dbgStepInDesc"), + description: l10n.lookup("dbgStepInDesc"), params: [], exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerStopped"); + return l10n.lookup("debuggerStopped"); } let controller = dbg._controller; @@ -377,13 +397,15 @@ * 'dbg step over' command */ exports.items.push({ + item: "command", + runAt: "client", name: 'dbg step out', - description: gcli.lookup("dbgStepOutDesc"), + description: l10n.lookup("dbgStepOutDesc"), params: [], exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerStopped"); + return l10n.lookup("debuggerStopped"); } let controller = dbg._controller; @@ -398,14 +420,16 @@ * 'dbg list' command */ exports.items.push({ + item: "command", + runAt: "client", name: "dbg list", - description: gcli.lookup("dbgListSourcesDesc"), + description: l10n.lookup("dbgListSourcesDesc"), params: [], returnType: "dom", exec: function(args, context) { let dbg = getPanel(context, "jsdebugger"); if (!dbg) { - return gcli.lookup("debuggerClosed"); + return l10n.lookup("debuggerClosed"); } let sources = getAllSources(dbg); @@ -440,10 +464,12 @@ } ].forEach(function(cmd) { const lookup = function(id) { - return gcli.lookup(cmd.l10nPrefix + id); + return l10n.lookup(cmd.l10nPrefix + id); }; exports.items.push({ + item: "command", + runAt: "client", name: "dbg " + cmd.name, description: lookup("Desc"), params: [ @@ -475,7 +501,7 @@ const dbg = getPanel(context, "jsdebugger"); const doc = context.environment.chromeDocument; if (!dbg) { - throw new Error(gcli.lookup("debuggerClosed")); + throw new Error(l10n.lookup("debuggerClosed")); } const { promise, resolve, reject } = context.defer(); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/definitions.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/definitions.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/definitions.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/definitions.js 2015-04-24 19:30:56.000000000 +0000 @@ -0,0 +1,409 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const {Cc, Ci, Cu} = require("chrome"); + +const { Services } = require("resource://gre/modules/Services.jsm"); + +loader.lazyGetter(this, "osString", () => Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS); + +// Panels +loader.lazyGetter(this, "OptionsPanel", () => require("devtools/framework/toolbox-options").OptionsPanel); +loader.lazyGetter(this, "InspectorPanel", () => require("devtools/inspector/inspector-panel").InspectorPanel); +loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/webconsole/panel").WebConsolePanel); +loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/debugger/panel").DebuggerPanel); +loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/styleeditor/styleeditor-panel").StyleEditorPanel); +loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/shadereditor/panel").ShaderEditorPanel); +loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/canvasdebugger/panel").CanvasDebuggerPanel); +loader.lazyGetter(this, "WebAudioEditorPanel", () => require("devtools/webaudioeditor/panel").WebAudioEditorPanel); +loader.lazyGetter(this, "PerformancePanel", () => require("devtools/performance/panel").PerformancePanel); +loader.lazyGetter(this, "NetMonitorPanel", () => require("devtools/netmonitor/panel").NetMonitorPanel); +loader.lazyGetter(this, "StoragePanel", () => require("devtools/storage/panel").StoragePanel); +loader.lazyGetter(this, "ScratchpadPanel", () => require("devtools/scratchpad/scratchpad-panel").ScratchpadPanel); + +// Strings +const toolboxProps = "chrome://browser/locale/devtools/toolbox.properties"; +const inspectorProps = "chrome://browser/locale/devtools/inspector.properties"; +const webConsoleProps = "chrome://browser/locale/devtools/webconsole.properties"; +const debuggerProps = "chrome://browser/locale/devtools/debugger.properties"; +const styleEditorProps = "chrome://browser/locale/devtools/styleeditor.properties"; +const shaderEditorProps = "chrome://browser/locale/devtools/shadereditor.properties"; +const canvasDebuggerProps = "chrome://browser/locale/devtools/canvasdebugger.properties"; +const webAudioEditorProps = "chrome://browser/locale/devtools/webaudioeditor.properties"; +const profilerProps = "chrome://browser/locale/devtools/profiler.properties"; +const netMonitorProps = "chrome://browser/locale/devtools/netmonitor.properties"; +const storageProps = "chrome://browser/locale/devtools/storage.properties"; +const scratchpadProps = "chrome://browser/locale/devtools/scratchpad.properties"; + +loader.lazyGetter(this, "toolboxStrings", () => Services.strings.createBundle(toolboxProps)); +loader.lazyGetter(this, "profilerStrings",() => Services.strings.createBundle(profilerProps)); +loader.lazyGetter(this, "webConsoleStrings", () => Services.strings.createBundle(webConsoleProps)); +loader.lazyGetter(this, "debuggerStrings", () => Services.strings.createBundle(debuggerProps)); +loader.lazyGetter(this, "styleEditorStrings", () => Services.strings.createBundle(styleEditorProps)); +loader.lazyGetter(this, "shaderEditorStrings", () => Services.strings.createBundle(shaderEditorProps)); +loader.lazyGetter(this, "canvasDebuggerStrings", () => Services.strings.createBundle(canvasDebuggerProps)); +loader.lazyGetter(this, "webAudioEditorStrings", () => Services.strings.createBundle(webAudioEditorProps)); +loader.lazyGetter(this, "inspectorStrings", () => Services.strings.createBundle(inspectorProps)); +loader.lazyGetter(this, "netMonitorStrings", () => Services.strings.createBundle(netMonitorProps)); +loader.lazyGetter(this, "storageStrings", () => Services.strings.createBundle(storageProps)); +loader.lazyGetter(this, "scratchpadStrings", () => Services.strings.createBundle(scratchpadProps)); + +let Tools = {}; +exports.Tools = Tools; + +// Definitions +Tools.options = { + id: "options", + ordinal: 0, + url: "chrome://browser/content/devtools/framework/toolbox-options.xul", + icon: "chrome://browser/skin/devtools/tool-options.svg", + invertIconForLightTheme: true, + bgTheme: "theme-body", + label: l10n("options.label", toolboxStrings), + iconOnly: true, + panelLabel: l10n("options.panelLabel", toolboxStrings), + tooltip: l10n("optionsButton.tooltip", toolboxStrings), + inMenu: false, + + isTargetSupported: function(target) { + return true; + }, + + build: function(iframeWindow, toolbox) { + return new OptionsPanel(iframeWindow, toolbox); + } +} + +Tools.inspector = { + id: "inspector", + accesskey: l10n("inspector.accesskey", inspectorStrings), + key: l10n("inspector.commandkey", inspectorStrings), + ordinal: 1, + modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", + icon: "chrome://browser/skin/devtools/tool-inspector.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/inspector/inspector.xul", + label: l10n("inspector.label", inspectorStrings), + panelLabel: l10n("inspector.panelLabel", inspectorStrings), + tooltip: l10n("inspector.tooltip", inspectorStrings), + inMenu: true, + commands: [ + "devtools/resize-commands", + "devtools/inspector/inspector-commands", + "devtools/eyedropper/commands.js" + ], + + preventClosingOnKey: true, + onkey: function(panel) { + panel.toolbox.highlighterUtils.togglePicker(); + }, + + isTargetSupported: function(target) { + return target.hasActor("inspector"); + }, + + build: function(iframeWindow, toolbox) { + return new InspectorPanel(iframeWindow, toolbox); + } +}; + +Tools.webConsole = { + id: "webconsole", + key: l10n("cmd.commandkey", webConsoleStrings), + accesskey: l10n("webConsoleCmd.accesskey", webConsoleStrings), + modifiers: Services.appinfo.OS == "Darwin" ? "accel,alt" : "accel,shift", + ordinal: 2, + icon: "chrome://browser/skin/devtools/tool-webconsole.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/webconsole.xul", + label: l10n("ToolboxTabWebconsole.label", webConsoleStrings), + menuLabel: l10n("MenuWebconsole.label", webConsoleStrings), + panelLabel: l10n("ToolboxWebConsole.panelLabel", webConsoleStrings), + tooltip: l10n("ToolboxWebconsole.tooltip", webConsoleStrings), + inMenu: true, + commands: "devtools/webconsole/console-commands", + + preventClosingOnKey: true, + onkey: function(panel, toolbox) { + if (toolbox.splitConsole) + return toolbox.focusConsoleInput(); + + panel.focusInput(); + }, + + isTargetSupported: function(target) { + return true; + }, + + build: function(iframeWindow, toolbox) { + return new WebConsolePanel(iframeWindow, toolbox); + } +}; + +Tools.jsdebugger = { + id: "jsdebugger", + key: l10n("debuggerMenu.commandkey", debuggerStrings), + accesskey: l10n("debuggerMenu.accesskey", debuggerStrings), + modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", + ordinal: 3, + icon: "chrome://browser/skin/devtools/tool-debugger.svg", + invertIconForLightTheme: true, + highlightedicon: "chrome://browser/skin/devtools/tool-debugger-paused.svg", + url: "chrome://browser/content/devtools/debugger.xul", + label: l10n("ToolboxDebugger.label", debuggerStrings), + panelLabel: l10n("ToolboxDebugger.panelLabel", debuggerStrings), + tooltip: l10n("ToolboxDebugger.tooltip", debuggerStrings), + inMenu: true, + commands: "devtools/debugger/debugger-commands", + + isTargetSupported: function(target) { + return true; + }, + + build: function(iframeWindow, toolbox) { + return new DebuggerPanel(iframeWindow, toolbox); + } +}; + +Tools.styleEditor = { + id: "styleeditor", + key: l10n("open.commandkey", styleEditorStrings), + ordinal: 4, + accesskey: l10n("open.accesskey", styleEditorStrings), + modifiers: "shift", + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/styleeditor.xul", + label: l10n("ToolboxStyleEditor.label", styleEditorStrings), + panelLabel: l10n("ToolboxStyleEditor.panelLabel", styleEditorStrings), + tooltip: l10n("ToolboxStyleEditor.tooltip2", styleEditorStrings), + inMenu: true, + commands: "devtools/styleeditor/styleeditor-commands", + + isTargetSupported: function(target) { + return target.hasActor("styleEditor") || target.hasActor("styleSheets"); + }, + + build: function(iframeWindow, toolbox) { + return new StyleEditorPanel(iframeWindow, toolbox); + } +}; + +Tools.shaderEditor = { + id: "shadereditor", + ordinal: 5, + visibilityswitch: "devtools.shadereditor.enabled", + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/shadereditor.xul", + label: l10n("ToolboxShaderEditor.label", shaderEditorStrings), + panelLabel: l10n("ToolboxShaderEditor.panelLabel", shaderEditorStrings), + tooltip: l10n("ToolboxShaderEditor.tooltip", shaderEditorStrings), + + isTargetSupported: function(target) { + return target.hasActor("webgl") && !target.chrome; + }, + + build: function(iframeWindow, toolbox) { + return new ShaderEditorPanel(iframeWindow, toolbox); + } +}; + +Tools.canvasDebugger = { + id: "canvasdebugger", + ordinal: 6, + visibilityswitch: "devtools.canvasdebugger.enabled", + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/canvasdebugger.xul", + label: l10n("ToolboxCanvasDebugger.label", canvasDebuggerStrings), + panelLabel: l10n("ToolboxCanvasDebugger.panelLabel", canvasDebuggerStrings), + tooltip: l10n("ToolboxCanvasDebugger.tooltip", canvasDebuggerStrings), + + // Hide the Canvas Debugger in the Add-on Debugger and Browser Toolbox + // (bug 1047520). + isTargetSupported: function(target) { + return target.hasActor("canvas") && !target.chrome; + }, + + build: function (iframeWindow, toolbox) { + return new CanvasDebuggerPanel(iframeWindow, toolbox); + } +}; + +Tools.performance = { + id: "performance", + ordinal: 7, + icon: "chrome://browser/skin/devtools/tool-profiler.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/performance.xul", + visibilityswitch: "devtools.performance.enabled", + label: l10n("profiler.label2", profilerStrings), + panelLabel: l10n("profiler.panelLabel2", profilerStrings), + tooltip: l10n("profiler.tooltip2", profilerStrings), + accesskey: l10n("profiler.accesskey", profilerStrings), + key: l10n("profiler.commandkey2", profilerStrings), + modifiers: "shift", + inMenu: true, + + isTargetSupported: function (target) { + return target.hasActor("profiler"); + }, + + build: function (frame, target) { + return new PerformancePanel(frame, target); + } +}; + +Tools.netMonitor = { + id: "netmonitor", + accesskey: l10n("netmonitor.accesskey", netMonitorStrings), + key: l10n("netmonitor.commandkey", netMonitorStrings), + ordinal: 9, + modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", + visibilityswitch: "devtools.netmonitor.enabled", + icon: "chrome://browser/skin/devtools/tool-network.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/netmonitor.xul", + label: l10n("netmonitor.label", netMonitorStrings), + panelLabel: l10n("netmonitor.panelLabel", netMonitorStrings), + tooltip: l10n("netmonitor.tooltip", netMonitorStrings), + inMenu: true, + + isTargetSupported: function(target) { + return target.getTrait("networkMonitor"); + }, + + build: function(iframeWindow, toolbox) { + return new NetMonitorPanel(iframeWindow, toolbox); + } +}; + +Tools.storage = { + id: "storage", + key: l10n("storage.commandkey", storageStrings), + ordinal: 10, + accesskey: l10n("storage.accesskey", storageStrings), + modifiers: "shift", + visibilityswitch: "devtools.storage.enabled", + icon: "chrome://browser/skin/devtools/tool-storage.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/storage.xul", + label: l10n("storage.label", storageStrings), + menuLabel: l10n("storage.menuLabel", storageStrings), + panelLabel: l10n("storage.panelLabel", storageStrings), + tooltip: l10n("storage.tooltip2", storageStrings), + inMenu: true, + + isTargetSupported: function(target) { + return target.isLocalTab || + ( target.hasActor("storage") && + target.getTrait("storageInspector") ); + }, + + build: function(iframeWindow, toolbox) { + return new StoragePanel(iframeWindow, toolbox); + } +}; + +Tools.webAudioEditor = { + id: "webaudioeditor", + ordinal: 11, + visibilityswitch: "devtools.webaudioeditor.enabled", + icon: "chrome://browser/skin/devtools/tool-webaudio.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/webaudioeditor.xul", + label: l10n("ToolboxWebAudioEditor1.label", webAudioEditorStrings), + panelLabel: l10n("ToolboxWebAudioEditor1.panelLabel", webAudioEditorStrings), + tooltip: l10n("ToolboxWebAudioEditor1.tooltip", webAudioEditorStrings), + + isTargetSupported: function(target) { + return !target.chrome && target.hasActor("webaudio"); + }, + + build: function(iframeWindow, toolbox) { + return new WebAudioEditorPanel(iframeWindow, toolbox); + } +}; + +Tools.scratchpad = { + id: "scratchpad", + ordinal: 12, + visibilityswitch: "devtools.scratchpad.enabled", + icon: "chrome://browser/skin/devtools/tool-scratchpad.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/scratchpad.xul", + label: l10n("scratchpad.label", scratchpadStrings), + panelLabel: l10n("scratchpad.panelLabel", scratchpadStrings), + tooltip: l10n("scratchpad.tooltip", scratchpadStrings), + inMenu: false, + commands: "devtools/scratchpad/scratchpad-commands", + + isTargetSupported: function(target) { + return target.isRemote; + }, + + build: function(iframeWindow, toolbox) { + return new ScratchpadPanel(iframeWindow, toolbox); + } +}; + +let defaultTools = [ + Tools.options, + Tools.webConsole, + Tools.inspector, + Tools.jsdebugger, + Tools.styleEditor, + Tools.shaderEditor, + Tools.canvasDebugger, + Tools.webAudioEditor, + Tools.performance, + Tools.netMonitor, + Tools.storage, + Tools.scratchpad +]; + +exports.defaultTools = defaultTools; + +Tools.darkTheme = { + id: "dark", + label: l10n("options.darkTheme.label", toolboxStrings), + ordinal: 1, + stylesheets: ["chrome://browser/skin/devtools/dark-theme.css"], + classList: ["theme-dark"], +}; + +Tools.lightTheme = { + id: "light", + label: l10n("options.lightTheme.label", toolboxStrings), + ordinal: 2, + stylesheets: ["chrome://browser/skin/devtools/light-theme.css"], + classList: ["theme-light"], +}; + +exports.defaultThemes = [ + Tools.darkTheme, + Tools.lightTheme, +]; + +/** + * Lookup l10n string from a string bundle. + * + * @param {string} name + * The key to lookup. + * @param {StringBundle} bundle + * The key to lookup. + * @returns A localized version of the given key. + */ +function l10n(name, bundle) +{ + try { + return bundle.GetStringFromName(name); + } catch (ex) { + Services.console.logStringMessage("Error reading '" + name + "'"); + throw new Error("l10n error with " + name); + } +} diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/eyedropper/commands.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/eyedropper/commands.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/eyedropper/commands.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/eyedropper/commands.js 2015-04-24 19:30:56.000000000 +0000 @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -const gcli = require("gcli/index"); +const l10n = require("gcli/l10n"); const EventEmitter = require("devtools/toolkit/event-emitter"); const eventEmitter = new EventEmitter(); @@ -12,14 +12,19 @@ * 'eyedropper' command */ exports.items = [{ + item: "command", + runAt: "client", name: "eyedropper", - description: gcli.lookup("eyedropperDesc"), - manual: gcli.lookup("eyedropperManual"), + description: l10n.lookup("eyedropperDesc"), + manual: l10n.lookup("eyedropperManual"), buttonId: "command-button-eyedropper", buttonClass: "command-button command-button-invertable", - tooltipText: gcli.lookup("eyedropperTooltip"), + tooltipText: l10n.lookup("eyedropperTooltip"), state: { isChecked: function(target) { + if (!target.tab) { + return false; + } let chromeWindow = target.tab.ownerDocument.defaultView; let dropper = EyedropperManager.getInstance(chromeWindow); if (dropper) { diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/framework/sidebar.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/framework/sidebar.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/framework/sidebar.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/framework/sidebar.js 2015-04-24 19:30:57.000000000 +0000 @@ -120,7 +120,7 @@ let tabs = this._tabbox.tabs; // Create a container and insert it first in the tabbox - let allTabsContainer = this._panelDoc.createElementNS(XULNS, "box"); + let allTabsContainer = this._panelDoc.createElementNS(XULNS, "stack"); this._tabbox.insertBefore(allTabsContainer, tabs); // Move the tabs inside and make them flex @@ -130,8 +130,10 @@ // Create the dropdown menu next to the tabs this._allTabsBtn = this._panelDoc.createElementNS(XULNS, "toolbarbutton"); this._allTabsBtn.setAttribute("class", "devtools-sidebar-alltabs"); + this._allTabsBtn.setAttribute("right", "0"); + this._allTabsBtn.setAttribute("top", "0"); + this._allTabsBtn.setAttribute("width", "15"); this._allTabsBtn.setAttribute("type", "menu"); - this._allTabsBtn.setAttribute("label", l10n("sidebar.showAllTabs.label")); this._allTabsBtn.setAttribute("tooltiptext", l10n("sidebar.showAllTabs.tooltip")); this._allTabsBtn.setAttribute("hidden", "true"); allTabsContainer.appendChild(this._allTabsBtn); @@ -162,7 +164,7 @@ // Moving back the tabs as a first child of the tabbox this._tabbox.insertBefore(tabs, this._tabbox.tabpanels); - this._tabbox.querySelector("box").remove(); + this._tabbox.querySelector("stack").remove(); this._allTabsBtn = null; }, diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/framework/test/browser_toolbox_tool_remote_reopen.js 2015-04-24 19:30:57.000000000 +0000 @@ -118,6 +118,10 @@ todo(false, "Front for " + actor + " still held in pool!"); continue; } + // gcliActor is for the commandline which is separate to the toolbox + if (actor.contains("gcliActor")) { + continue; + } ok(false, "Front for " + actor + " still held in pool!"); } } diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/framework/toolbox.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/framework/toolbox.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/framework/toolbox.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/framework/toolbox.js 2015-04-24 19:30:57.000000000 +0000 @@ -713,10 +713,13 @@ this._buildPickerButton(); } - let spec = CommandUtils.getCommandbarSpec("devtools.toolbox.toolbarSpec"); - let environment = CommandUtils.createEnvironment(this, '_target'); - return CommandUtils.createRequisition(environment).then(requisition => { + const options = { + environment: CommandUtils.createEnvironment(this, '_target') + }; + return CommandUtils.createRequisition(this.target, options).then(requisition => { this._requisition = requisition; + + const spec = CommandUtils.getCommandbarSpec("devtools.toolbox.toolbarSpec"); return CommandUtils.createButtons(spec, this.target, this.doc, requisition).then(buttons => { let container = this.doc.getElementById("toolbox-buttons"); @@ -1752,7 +1755,7 @@ let win = this.frame.ownerGlobal; if (this._requisition) { - this._requisition.destroy(); + CommandUtils.destroyRequisition(this._requisition, this.target); } this._telemetry.toolClosed("toolbox"); this._telemetry.destroy(); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/inspector/inspector-commands.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/inspector/inspector-commands.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/inspector/inspector-commands.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/inspector/inspector-commands.js 2015-04-24 19:30:57.000000000 +0000 @@ -4,18 +4,20 @@ "use strict"; -const gcli = require("gcli/index"); +const l10n = require("gcli/l10n"); exports.items = [{ + item: "command", + runAt: "server", name: "inspect", - description: gcli.lookup("inspectDesc"), - manual: gcli.lookup("inspectManual"), + description: l10n.lookup("inspectDesc"), + manual: l10n.lookup("inspectManual"), params: [ { name: "selector", type: "node", - description: gcli.lookup("inspectNodeDesc"), - manual: gcli.lookup("inspectNodeManual") + description: l10n.lookup("inspectNodeDesc"), + manual: l10n.lookup("inspectNodeManual") } ], exec: function(args, context) { diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/inspector/inspector-panel.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/inspector/inspector-panel.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/inspector/inspector-panel.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/inspector/inspector-panel.js 2015-04-24 19:30:57.000000000 +0000 @@ -833,6 +833,12 @@ let button = this._paneToggleButton; let isVisible = !button.hasAttribute("pane-collapsed"); + // Make sure the sidebar has a width attribute before collapsing because + // ViewHelpers needs it. + if (isVisible && !sidePane.hasAttribute("width")) { + sidePane.setAttribute("width", sidePane.getBoundingClientRect().width); + } + ViewHelpers.togglePane({ visible: !isVisible, animated: true, diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/main.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/main.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/main.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/main.js 2015-04-24 19:30:57.000000000 +0000 @@ -4,11 +4,20 @@ "use strict"; -const {Cc, Ci, Cu} = require("chrome"); - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +const { Cu } = require("chrome"); Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource:///modules/devtools/gDevTools.jsm"); +const { gDevTools } = require("resource:///modules/devtools/gDevTools.jsm"); + +const { defaultTools, defaultThemes } = require("definitions"); + +defaultTools.forEach(definition => gDevTools.registerTool(definition)); +defaultThemes.forEach(definition => gDevTools.registerTheme(definition)); + +// Re-export for backwards compatibility, but we should probably the +// definitions from require("definitions") in the future +exports.defaultTools = require("definitions").defaultTools; +exports.defaultThemes = require("definitions").defaultThemes; +exports.Tools = require("definitions").Tools; Object.defineProperty(exports, "Toolbox", { get: () => require("devtools/framework/toolbox").Toolbox @@ -17,398 +26,7 @@ get: () => require("devtools/framework/target").TargetFactory }); -loader.lazyGetter(this, "osString", () => Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).OS); - -let events = require("sdk/system/events"); - -// Panels -loader.lazyGetter(this, "OptionsPanel", () => require("devtools/framework/toolbox-options").OptionsPanel); -loader.lazyGetter(this, "InspectorPanel", () => require("devtools/inspector/inspector-panel").InspectorPanel); -loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/webconsole/panel").WebConsolePanel); -loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/debugger/panel").DebuggerPanel); -loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/styleeditor/styleeditor-panel").StyleEditorPanel); -loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/shadereditor/panel").ShaderEditorPanel); -loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/canvasdebugger/panel").CanvasDebuggerPanel); -loader.lazyGetter(this, "WebAudioEditorPanel", () => require("devtools/webaudioeditor/panel").WebAudioEditorPanel); -loader.lazyGetter(this, "PerformancePanel", () => require("devtools/performance/panel").PerformancePanel); -loader.lazyGetter(this, "NetMonitorPanel", () => require("devtools/netmonitor/panel").NetMonitorPanel); -loader.lazyGetter(this, "StoragePanel", () => require("devtools/storage/panel").StoragePanel); -loader.lazyGetter(this, "ScratchpadPanel", () => require("devtools/scratchpad/scratchpad-panel").ScratchpadPanel); - -// Strings -const toolboxProps = "chrome://browser/locale/devtools/toolbox.properties"; -const inspectorProps = "chrome://browser/locale/devtools/inspector.properties"; -const webConsoleProps = "chrome://browser/locale/devtools/webconsole.properties"; -const debuggerProps = "chrome://browser/locale/devtools/debugger.properties"; -const styleEditorProps = "chrome://browser/locale/devtools/styleeditor.properties"; -const shaderEditorProps = "chrome://browser/locale/devtools/shadereditor.properties"; -const canvasDebuggerProps = "chrome://browser/locale/devtools/canvasdebugger.properties"; -const webAudioEditorProps = "chrome://browser/locale/devtools/webaudioeditor.properties"; -const profilerProps = "chrome://browser/locale/devtools/profiler.properties"; -const netMonitorProps = "chrome://browser/locale/devtools/netmonitor.properties"; -const storageProps = "chrome://browser/locale/devtools/storage.properties"; -const scratchpadProps = "chrome://browser/locale/devtools/scratchpad.properties"; - -loader.lazyGetter(this, "toolboxStrings", () => Services.strings.createBundle(toolboxProps)); -loader.lazyGetter(this, "profilerStrings",() => Services.strings.createBundle(profilerProps)); -loader.lazyGetter(this, "webConsoleStrings", () => Services.strings.createBundle(webConsoleProps)); -loader.lazyGetter(this, "debuggerStrings", () => Services.strings.createBundle(debuggerProps)); -loader.lazyGetter(this, "styleEditorStrings", () => Services.strings.createBundle(styleEditorProps)); -loader.lazyGetter(this, "shaderEditorStrings", () => Services.strings.createBundle(shaderEditorProps)); -loader.lazyGetter(this, "canvasDebuggerStrings", () => Services.strings.createBundle(canvasDebuggerProps)); -loader.lazyGetter(this, "webAudioEditorStrings", () => Services.strings.createBundle(webAudioEditorProps)); -loader.lazyGetter(this, "inspectorStrings", () => Services.strings.createBundle(inspectorProps)); -loader.lazyGetter(this, "netMonitorStrings", () => Services.strings.createBundle(netMonitorProps)); -loader.lazyGetter(this, "storageStrings", () => Services.strings.createBundle(storageProps)); -loader.lazyGetter(this, "scratchpadStrings", () => Services.strings.createBundle(scratchpadProps)); - -let Tools = {}; -exports.Tools = Tools; - -// Definitions -Tools.options = { - id: "options", - ordinal: 0, - url: "chrome://browser/content/devtools/framework/toolbox-options.xul", - icon: "chrome://browser/skin/devtools/tool-options.svg", - invertIconForLightTheme: true, - bgTheme: "theme-body", - label: l10n("options.label", toolboxStrings), - iconOnly: true, - panelLabel: l10n("options.panelLabel", toolboxStrings), - tooltip: l10n("optionsButton.tooltip", toolboxStrings), - inMenu: false, - - isTargetSupported: function(target) { - return true; - }, - - build: function(iframeWindow, toolbox) { - return new OptionsPanel(iframeWindow, toolbox); - } -} - -Tools.inspector = { - id: "inspector", - accesskey: l10n("inspector.accesskey", inspectorStrings), - key: l10n("inspector.commandkey", inspectorStrings), - ordinal: 1, - modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", - icon: "chrome://browser/skin/devtools/tool-inspector.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/inspector/inspector.xul", - label: l10n("inspector.label", inspectorStrings), - panelLabel: l10n("inspector.panelLabel", inspectorStrings), - tooltip: l10n("inspector.tooltip", inspectorStrings), - inMenu: true, - commands: [ - "devtools/resize-commands", - "devtools/inspector/inspector-commands", - "devtools/eyedropper/commands.js" - ], - - preventClosingOnKey: true, - onkey: function(panel) { - panel.toolbox.highlighterUtils.togglePicker(); - }, - - isTargetSupported: function(target) { - return target.hasActor("inspector"); - }, - - build: function(iframeWindow, toolbox) { - return new InspectorPanel(iframeWindow, toolbox); - } -}; - -Tools.webConsole = { - id: "webconsole", - key: l10n("cmd.commandkey", webConsoleStrings), - accesskey: l10n("webConsoleCmd.accesskey", webConsoleStrings), - modifiers: Services.appinfo.OS == "Darwin" ? "accel,alt" : "accel,shift", - ordinal: 2, - icon: "chrome://browser/skin/devtools/tool-webconsole.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/webconsole.xul", - label: l10n("ToolboxTabWebconsole.label", webConsoleStrings), - menuLabel: l10n("MenuWebconsole.label", webConsoleStrings), - panelLabel: l10n("ToolboxWebConsole.panelLabel", webConsoleStrings), - tooltip: l10n("ToolboxWebconsole.tooltip", webConsoleStrings), - inMenu: true, - commands: "devtools/webconsole/console-commands", - - preventClosingOnKey: true, - onkey: function(panel, toolbox) { - if (toolbox.splitConsole) - return toolbox.focusConsoleInput(); - - panel.focusInput(); - }, - - isTargetSupported: function(target) { - return true; - }, - - build: function(iframeWindow, toolbox) { - return new WebConsolePanel(iframeWindow, toolbox); - } -}; - -Tools.jsdebugger = { - id: "jsdebugger", - key: l10n("debuggerMenu.commandkey", debuggerStrings), - accesskey: l10n("debuggerMenu.accesskey", debuggerStrings), - modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", - ordinal: 3, - icon: "chrome://browser/skin/devtools/tool-debugger.svg", - invertIconForLightTheme: true, - highlightedicon: "chrome://browser/skin/devtools/tool-debugger-paused.svg", - url: "chrome://browser/content/devtools/debugger.xul", - label: l10n("ToolboxDebugger.label", debuggerStrings), - panelLabel: l10n("ToolboxDebugger.panelLabel", debuggerStrings), - tooltip: l10n("ToolboxDebugger.tooltip", debuggerStrings), - inMenu: true, - commands: "devtools/debugger/debugger-commands", - - isTargetSupported: function(target) { - return true; - }, - - build: function(iframeWindow, toolbox) { - return new DebuggerPanel(iframeWindow, toolbox); - } -}; - -Tools.styleEditor = { - id: "styleeditor", - key: l10n("open.commandkey", styleEditorStrings), - ordinal: 4, - accesskey: l10n("open.accesskey", styleEditorStrings), - modifiers: "shift", - icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/styleeditor.xul", - label: l10n("ToolboxStyleEditor.label", styleEditorStrings), - panelLabel: l10n("ToolboxStyleEditor.panelLabel", styleEditorStrings), - tooltip: l10n("ToolboxStyleEditor.tooltip2", styleEditorStrings), - inMenu: true, - commands: "devtools/styleeditor/styleeditor-commands", - - isTargetSupported: function(target) { - return target.hasActor("styleEditor") || target.hasActor("styleSheets"); - }, - - build: function(iframeWindow, toolbox) { - return new StyleEditorPanel(iframeWindow, toolbox); - } -}; - -Tools.shaderEditor = { - id: "shadereditor", - ordinal: 5, - visibilityswitch: "devtools.shadereditor.enabled", - icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/shadereditor.xul", - label: l10n("ToolboxShaderEditor.label", shaderEditorStrings), - panelLabel: l10n("ToolboxShaderEditor.panelLabel", shaderEditorStrings), - tooltip: l10n("ToolboxShaderEditor.tooltip", shaderEditorStrings), - - isTargetSupported: function(target) { - return target.hasActor("webgl") && !target.chrome; - }, - - build: function(iframeWindow, toolbox) { - return new ShaderEditorPanel(iframeWindow, toolbox); - } -}; - -Tools.canvasDebugger = { - id: "canvasdebugger", - ordinal: 6, - visibilityswitch: "devtools.canvasdebugger.enabled", - icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/canvasdebugger.xul", - label: l10n("ToolboxCanvasDebugger.label", canvasDebuggerStrings), - panelLabel: l10n("ToolboxCanvasDebugger.panelLabel", canvasDebuggerStrings), - tooltip: l10n("ToolboxCanvasDebugger.tooltip", canvasDebuggerStrings), - - // Hide the Canvas Debugger in the Add-on Debugger and Browser Toolbox - // (bug 1047520). - isTargetSupported: function(target) { - return target.hasActor("canvas") && !target.chrome; - }, - - build: function (iframeWindow, toolbox) { - return new CanvasDebuggerPanel(iframeWindow, toolbox); - } -}; - -Tools.performance = { - id: "performance", - ordinal: 7, - icon: "chrome://browser/skin/devtools/tool-profiler.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/performance.xul", - visibilityswitch: "devtools.performance.enabled", - label: l10n("profiler.label2", profilerStrings), - panelLabel: l10n("profiler.panelLabel2", profilerStrings), - tooltip: l10n("profiler.tooltip2", profilerStrings), - accesskey: l10n("profiler.accesskey", profilerStrings), - key: l10n("profiler.commandkey2", profilerStrings), - modifiers: "shift", - inMenu: true, - - isTargetSupported: function (target) { - return target.hasActor("profiler"); - }, - - build: function (frame, target) { - return new PerformancePanel(frame, target); - } -}; - -Tools.netMonitor = { - id: "netmonitor", - accesskey: l10n("netmonitor.accesskey", netMonitorStrings), - key: l10n("netmonitor.commandkey", netMonitorStrings), - ordinal: 9, - modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", - visibilityswitch: "devtools.netmonitor.enabled", - icon: "chrome://browser/skin/devtools/tool-network.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/netmonitor.xul", - label: l10n("netmonitor.label", netMonitorStrings), - panelLabel: l10n("netmonitor.panelLabel", netMonitorStrings), - tooltip: l10n("netmonitor.tooltip", netMonitorStrings), - inMenu: true, - - isTargetSupported: function(target) { - return target.getTrait("networkMonitor"); - }, - - build: function(iframeWindow, toolbox) { - return new NetMonitorPanel(iframeWindow, toolbox); - } -}; - -Tools.storage = { - id: "storage", - key: l10n("storage.commandkey", storageStrings), - ordinal: 10, - accesskey: l10n("storage.accesskey", storageStrings), - modifiers: "shift", - visibilityswitch: "devtools.storage.enabled", - icon: "chrome://browser/skin/devtools/tool-storage.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/storage.xul", - label: l10n("storage.label", storageStrings), - menuLabel: l10n("storage.menuLabel", storageStrings), - panelLabel: l10n("storage.panelLabel", storageStrings), - tooltip: l10n("storage.tooltip2", storageStrings), - inMenu: true, - - isTargetSupported: function(target) { - return target.isLocalTab || - ( target.hasActor("storage") && - target.getTrait("storageInspector") ); - }, - - build: function(iframeWindow, toolbox) { - return new StoragePanel(iframeWindow, toolbox); - } -}; - -Tools.webAudioEditor = { - id: "webaudioeditor", - ordinal: 11, - visibilityswitch: "devtools.webaudioeditor.enabled", - icon: "chrome://browser/skin/devtools/tool-webaudio.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/webaudioeditor.xul", - label: l10n("ToolboxWebAudioEditor1.label", webAudioEditorStrings), - panelLabel: l10n("ToolboxWebAudioEditor1.panelLabel", webAudioEditorStrings), - tooltip: l10n("ToolboxWebAudioEditor1.tooltip", webAudioEditorStrings), - - isTargetSupported: function(target) { - return !target.chrome && target.hasActor("webaudio"); - }, - - build: function(iframeWindow, toolbox) { - return new WebAudioEditorPanel(iframeWindow, toolbox); - } -}; - -Tools.scratchpad = { - id: "scratchpad", - ordinal: 12, - visibilityswitch: "devtools.scratchpad.enabled", - icon: "chrome://browser/skin/devtools/tool-scratchpad.svg", - invertIconForLightTheme: true, - url: "chrome://browser/content/devtools/scratchpad.xul", - label: l10n("scratchpad.label", scratchpadStrings), - panelLabel: l10n("scratchpad.panelLabel", scratchpadStrings), - tooltip: l10n("scratchpad.tooltip", scratchpadStrings), - inMenu: false, - commands: "devtools/scratchpad/scratchpad-commands", - - isTargetSupported: function(target) { - return target.isRemote; - }, - - build: function(iframeWindow, toolbox) { - return new ScratchpadPanel(iframeWindow, toolbox); - } -}; - -let defaultTools = [ - Tools.options, - Tools.webConsole, - Tools.inspector, - Tools.jsdebugger, - Tools.styleEditor, - Tools.shaderEditor, - Tools.canvasDebugger, - Tools.webAudioEditor, - Tools.performance, - Tools.netMonitor, - Tools.storage, - Tools.scratchpad -]; - -exports.defaultTools = defaultTools; - -for (let definition of defaultTools) { - gDevTools.registerTool(definition); -} - -Tools.darkTheme = { - id: "dark", - label: l10n("options.darkTheme.label", toolboxStrings), - ordinal: 1, - stylesheets: ["chrome://browser/skin/devtools/dark-theme.css"], - classList: ["theme-dark"], -}; - -Tools.lightTheme = { - id: "light", - label: l10n("options.lightTheme.label", toolboxStrings), - ordinal: 2, - stylesheets: ["chrome://browser/skin/devtools/light-theme.css"], - classList: ["theme-light"], -}; - -let defaultThemes = [ - Tools.darkTheme, - Tools.lightTheme, -]; - -for (let definition of defaultThemes) { - gDevTools.registerTheme(definition); -} - -var unloadObserver = { +const unloadObserver = { observe: function(subject, topic, data) { if (subject.wrappedJSObject === require("@loader/unload")) { Services.obs.removeObserver(unloadObserver, "sdk:loader:destroy"); @@ -423,23 +41,5 @@ }; Services.obs.addObserver(unloadObserver, "sdk:loader:destroy", false); +const events = require("sdk/system/events"); events.emit("devtools-loaded", {}); - -/** - * Lookup l10n string from a string bundle. - * - * @param {string} name - * The key to lookup. - * @param {StringBundle} bundle - * The key to lookup. - * @returns A localized version of the given key. - */ -function l10n(name, bundle) -{ - try { - return bundle.GetStringFromName(name); - } catch (ex) { - Services.console.logStringMessage("Error reading '" + name + "'"); - throw new Error("l10n error with " + name); - } -} diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/markupview/markup-view.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/markupview/markup-view.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/markupview/markup-view.js 2015-04-22 13:05:26.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/markupview/markup-view.js 2015-04-24 19:30:57.000000000 +0000 @@ -2162,7 +2162,7 @@ */ isImagePreviewTarget: function(target, tooltip) { if (!this.tooltipData || this.tooltipData.target !== target) { - return promise.reject(); + return promise.reject(false); } return this.tooltipData.data.then(({data, size}) => { diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/moz.build thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/moz.build --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/moz.build 2015-04-22 13:05:27.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/moz.build 2015-04-24 19:30:57.000000000 +0000 @@ -41,5 +41,6 @@ JAR_MANIFESTS += ['jar.mn'] EXTRA_JS_MODULES.devtools += [ + 'definitions.js', 'main.js', ] diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/performance/modules/front.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/performance/modules/front.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/performance/modules/front.js 2015-04-22 13:05:27.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/performance/modules/front.js 2015-04-24 19:30:57.000000000 +0000 @@ -430,7 +430,7 @@ stopRecording: Task.async(function*(model) { // If model isn't in the PerformanceActorsConnections internal store, // then do nothing. - if (!this._recordings.includes(model)) { + if (this._recordings.indexOf(model) === -1) { return; } diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/responsivedesign/resize-commands.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/responsivedesign/resize-commands.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/responsivedesign/resize-commands.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/responsivedesign/resize-commands.js 2015-04-24 19:30:57.000000000 +0000 @@ -11,43 +11,54 @@ createBundle("chrome://branding/locale/brand.properties"). GetStringFromName("brandShortName"); -const gcli = require("gcli/index"); +const l10n = require("gcli/l10n"); exports.items = [ { name: 'resize', - description: gcli.lookup('resizeModeDesc') + description: l10n.lookup('resizeModeDesc') }, { + item: "command", + runAt: "client", name: 'resize on', - description: gcli.lookup('resizeModeOnDesc'), - manual: gcli.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]), + description: l10n.lookup('resizeModeOnDesc'), + manual: l10n.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]), exec: gcli_cmd_resize }, { + item: "command", + runAt: "client", name: 'resize off', - description: gcli.lookup('resizeModeOffDesc'), - manual: gcli.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]), + description: l10n.lookup('resizeModeOffDesc'), + manual: l10n.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]), exec: gcli_cmd_resize }, { + item: "command", + runAt: "client", name: 'resize toggle', buttonId: "command-button-responsive", buttonClass: "command-button command-button-invertable", - tooltipText: gcli.lookup("resizeModeToggleTooltip"), - description: gcli.lookup('resizeModeToggleDesc'), - manual: gcli.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]), + tooltipText: l10n.lookup("resizeModeToggleTooltip"), + description: l10n.lookup('resizeModeToggleDesc'), + manual: l10n.lookupFormat('resizeModeManual2', [BRAND_SHORT_NAME]), state: { isChecked: function(aTarget) { + if (!aTarget.tab) { + return false; + } let browserWindow = aTarget.tab.ownerDocument.defaultView; let mgr = browserWindow.ResponsiveUI.ResponsiveUIManager; return mgr.isActiveForTab(aTarget.tab); }, onChange: function(aTarget, aChangeHandler) { - let browserWindow = aTarget.tab.ownerDocument.defaultView; - let mgr = browserWindow.ResponsiveUI.ResponsiveUIManager; - mgr.on("on", aChangeHandler); - mgr.on("off", aChangeHandler); + if (aTarget.tab) { + let browserWindow = aTarget.tab.ownerDocument.defaultView; + let mgr = browserWindow.ResponsiveUI.ResponsiveUIManager; + mgr.on("on", aChangeHandler); + mgr.on("off", aChangeHandler); + } }, offChange: function(aTarget, aChangeHandler) { if (aTarget.tab) { @@ -61,18 +72,20 @@ exec: gcli_cmd_resize }, { + item: "command", + runAt: "client", name: 'resize to', - description: gcli.lookup('resizeModeToDesc'), + description: l10n.lookup('resizeModeToDesc'), params: [ { name: 'width', type: 'number', - description: gcli.lookup("resizePageArgWidthDesc"), + description: l10n.lookup("resizePageArgWidthDesc"), }, { name: 'height', type: 'number', - description: gcli.lookup("resizePageArgHeightDesc"), + description: l10n.lookup("resizePageArgHeightDesc"), }, ], exec: gcli_cmd_resize diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/scratchpad/scratchpad-commands.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/scratchpad/scratchpad-commands.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/scratchpad/scratchpad-commands.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/scratchpad/scratchpad-commands.js 2015-04-24 19:30:57.000000000 +0000 @@ -4,13 +4,15 @@ "use strict"; -const gcli = require("gcli/index"); +const l10n = require("gcli/l10n"); exports.items = [{ + item: "command", + runAt: "client", name: "scratchpad", buttonId: "command-button-scratchpad", buttonClass: "command-button command-button-invertable", - tooltipText: gcli.lookup("scratchpadOpenTooltip"), + tooltipText: l10n.lookup("scratchpadOpenTooltip"), hidden: true, exec: function(args, context) { let Scratchpad = context.environment.chromeWindow.Scratchpad; diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/DeveloperToolbar.jsm thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/DeveloperToolbar.jsm --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/DeveloperToolbar.jsm 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/DeveloperToolbar.jsm 2015-04-24 19:30:57.000000000 +0000 @@ -39,14 +39,12 @@ const Telemetry = require("devtools/shared/telemetry"); -// This lazy getter is needed to prevent a require loop -XPCOMUtils.defineLazyGetter(this, "gcli", () => { +XPCOMUtils.defineLazyGetter(this, "gcliInit", function() { try { - require("devtools/commandline/commands-index"); - return require("gcli/index"); + return require("devtools/commandline/commands-index"); } catch (ex) { - console.error(ex); + console.log(ex); } }); @@ -62,7 +60,7 @@ enumerable: true }); -const promise = Cu.import('resource://gre/modules/Promise.jsm', {}).Promise; +const promise = Cu.import("resource://gre/modules/Promise.jsm", {}).Promise; /** * A collection of utilities to help working with commands @@ -71,13 +69,22 @@ /** * Utility to ensure that things are loaded in the correct order */ - createRequisition: function(environment) { - return gcli.load().then(() => { - return gcli.createRequisition({ environment: environment }); + createRequisition: function(target, options) { + return gcliInit.getSystem(target).then(system => { + var Requisition = require("gcli/cli").Requisition; + return new Requisition(system, options); }); }, /** + * Destroy the remote side of the requisition as well as the local side + */ + destroyRequisition: function(requisition, target) { + requisition.destroy(); + gcliInit.releaseSystem(target); + }, + + /** * Read a toolbarSpec from preferences * @param pref The name of the preference to read */ @@ -105,12 +112,6 @@ throw new Error("No command '" + typed + "'"); } - // Do not build a button for a non-remote safe command in a non-local target. - if (!target.isLocalTab && !command.isRemoteSafe) { - requisition.clear(); - return; - } - if (command.buttonId != null) { button.id = command.buttonId; if (command.buttonClass != null) { @@ -192,17 +193,17 @@ * @param targetContainer An object containing a 'target' property which * reflects the current debug target */ - createEnvironment: function(container, targetProperty='target') { + createEnvironment: function(container, targetProperty="target") { if (!container[targetProperty].toString || !/TabTarget/.test(container[targetProperty].toString())) { - throw new Error('Missing target'); + throw new Error("Missing target"); } return { get target() { if (!container[targetProperty].toString || !/TabTarget/.test(container[targetProperty].toString())) { - throw new Error('Removed target'); + throw new Error("Removed target"); } return container[targetProperty]; @@ -213,15 +214,17 @@ }, get chromeDocument() { - return this.chromeWindow.document; + return this.target.tab.ownerDocument.defaultView.document; }, get window() { - return this.chromeWindow.gBrowser.selectedBrowser.contentWindow; + // throw new Error("environment.window is not available in runAt:client commands"); + return this.chromeWindow.gBrowser.contentWindowAsCPOW; }, get document() { - return this.window.document; + // throw new Error("environment.document is not available in runAt:client commands"); + return this.chromeWindow.gBrowser.contentDocumentAsCPOW; } }; }, @@ -255,6 +258,8 @@ { this._chromeWindow = aChromeWindow; + this.target = null; // Will be setup when show() is called + this._element = aToolbarElement; this._element.hidden = true; this._doc = this._element.ownerDocument; @@ -292,20 +297,10 @@ DeveloperToolbar.prototype.NOTIFICATIONS = NOTIFICATIONS; /** - * target is dynamic because the selectedTab changes - */ -Object.defineProperty(DeveloperToolbar.prototype, "target", { - get: function() { - return TargetFactory.forTab(this._chromeWindow.gBrowser.selectedTab); - }, - enumerable: true -}); - -/** * Is the toolbar open? */ -Object.defineProperty(DeveloperToolbar.prototype, 'visible', { - get: function DT_visible() { +Object.defineProperty(DeveloperToolbar.prototype, "visible", { + get: function() { return !this._element.hidden; }, enumerable: true @@ -316,8 +311,8 @@ /** * Getter for a unique ID. */ -Object.defineProperty(DeveloperToolbar.prototype, 'sequenceId', { - get: function DT_visible() { +Object.defineProperty(DeveloperToolbar.prototype, "sequenceId", { + get: function() { return _gSequenceId++; }, enumerable: true @@ -408,57 +403,84 @@ this._doc.getElementById("Tools:DevToolbar").setAttribute("checked", "true"); - return gcli.load().then(() => { - this.display = gcli.createDisplay({ - contentDocument: this._chromeWindow.gBrowser.contentDocumentAsCPOW, - chromeDocument: this._doc, - chromeWindow: this._chromeWindow, - hintElement: this.tooltipPanel.hintElement, - inputElement: this._input, - completeElement: this._doc.querySelector(".gclitoolbar-complete-node"), - backgroundElement: this._doc.querySelector(".gclitoolbar-stack-node"), - outputDocument: this.outputPanel.document, - environment: CommandUtils.createEnvironment(this, "target"), - tooltipClass: "gcliterm-tooltip", - eval: null, - scratchpad: null - }); - - this.display.focusManager.addMonitoredElement(this.outputPanel._frame); - this.display.focusManager.addMonitoredElement(this._element); + this.target = TargetFactory.forTab(this._chromeWindow.gBrowser.selectedTab); + const options = { + environment: CommandUtils.createEnvironment(this, "target"), + document: this.outputPanel.document, + }; + return CommandUtils.createRequisition(this.target, options).then(requisition => { + this.requisition = requisition; + + return this.requisition.update(this._input.value).then(() => { + const Inputter = require('gcli/mozui/inputter').Inputter; + const Completer = require('gcli/mozui/completer').Completer; + const Tooltip = require('gcli/mozui/tooltip').Tooltip; + const FocusManager = require('gcli/ui/focus').FocusManager; + + this.onOutput = this.requisition.commandOutputManager.onOutput; + + this.focusManager = new FocusManager(this._doc, requisition.system.settings); + + this.inputter = new Inputter({ + requisition: this.requisition, + focusManager: this.focusManager, + element: this._input, + }); + + this.completer = new Completer({ + requisition: this.requisition, + inputter: this.inputter, + backgroundElement: this._doc.querySelector(".gclitoolbar-stack-node"), + element: this._doc.querySelector(".gclitoolbar-complete-node"), + }); + + this.tooltip = new Tooltip({ + requisition: this.requisition, + focusManager: this.focusManager, + inputter: this.inputter, + element: this.tooltipPanel.hintElement, + }); + + this.inputter.tooltip = this.tooltip; + + this.focusManager.addMonitoredElement(this.outputPanel._frame); + this.focusManager.addMonitoredElement(this._element); + + this.focusManager.onVisibilityChange.add(this.outputPanel._visibilityChanged, + this.outputPanel); + this.focusManager.onVisibilityChange.add(this.tooltipPanel._visibilityChanged, + this.tooltipPanel); + this.onOutput.add(this.outputPanel._outputChanged, this.outputPanel); + + let tabbrowser = this._chromeWindow.gBrowser; + tabbrowser.tabContainer.addEventListener("TabSelect", this, false); + tabbrowser.tabContainer.addEventListener("TabClose", this, false); + tabbrowser.addEventListener("load", this, true); + tabbrowser.addEventListener("beforeunload", this, true); + + this._initErrorsCount(tabbrowser.selectedTab); + this._devtoolsUnloaded = this._devtoolsUnloaded.bind(this); + this._devtoolsLoaded = this._devtoolsLoaded.bind(this); + Services.obs.addObserver(this._devtoolsUnloaded, "devtools-unloaded", false); + Services.obs.addObserver(this._devtoolsLoaded, "devtools-loaded", false); - this.display.onVisibilityChange.add(this.outputPanel._visibilityChanged, - this.outputPanel); - this.display.onVisibilityChange.add(this.tooltipPanel._visibilityChanged, - this.tooltipPanel); - this.display.onOutput.add(this.outputPanel._outputChanged, this.outputPanel); - - let tabbrowser = this._chromeWindow.gBrowser; - tabbrowser.tabContainer.addEventListener("TabSelect", this, false); - tabbrowser.tabContainer.addEventListener("TabClose", this, false); - tabbrowser.addEventListener("load", this, true); - tabbrowser.addEventListener("beforeunload", this, true); - - this._initErrorsCount(tabbrowser.selectedTab); - this._devtoolsUnloaded = this._devtoolsUnloaded.bind(this); - this._devtoolsLoaded = this._devtoolsLoaded.bind(this); - Services.obs.addObserver(this._devtoolsUnloaded, "devtools-unloaded", false); - Services.obs.addObserver(this._devtoolsLoaded, "devtools-loaded", false); + this._element.hidden = false; - this._element.hidden = false; - - if (focus) { - this._input.focus(); - } + if (focus) { + this._input.focus(); + } - this._notify(NOTIFICATIONS.SHOW); + this._notify(NOTIFICATIONS.SHOW); - if (!DeveloperToolbar.introShownThisSession) { - this.display.maybeShowIntro(); - DeveloperToolbar.introShownThisSession = true; - } + if (!DeveloperToolbar.introShownThisSession) { + let intro = require("gcli/ui/intro"); + intro.maybeShowIntro(this.requisition.commandOutputManager, + this.requisition.conversionContext); + DeveloperToolbar.introShownThisSession = true; + } - this._showPromise = null; + this._showPromise = null; + }); }); }); }); @@ -585,26 +607,26 @@ Services.obs.removeObserver(this._devtoolsLoaded, "devtools-loaded"); Array.prototype.forEach.call(tabbrowser.tabs, this._stopErrorsCount, this); - this.display.focusManager.removeMonitoredElement(this.outputPanel._frame); - this.display.focusManager.removeMonitoredElement(this._element); + this.focusManager.removeMonitoredElement(this.outputPanel._frame); + this.focusManager.removeMonitoredElement(this._element); + + this.focusManager.onVisibilityChange.remove(this.outputPanel._visibilityChanged, + this.outputPanel); + this.focusManager.onVisibilityChange.remove(this.tooltipPanel._visibilityChanged, + this.tooltipPanel); + this.onOutput.remove(this.outputPanel._outputChanged, this.outputPanel); + + this.tooltip.destroy(); + this.completer.destroy(); + this.inputter.destroy(); + this.focusManager.destroy(); - this.display.onVisibilityChange.remove(this.outputPanel._visibilityChanged, this.outputPanel); - this.display.onVisibilityChange.remove(this.tooltipPanel._visibilityChanged, this.tooltipPanel); - this.display.onOutput.remove(this.outputPanel._outputChanged, this.outputPanel); - this.display.destroy(); this.outputPanel.destroy(); this.tooltipPanel.destroy(); delete this._input; - // We could "delete this.display" etc if we have hard-to-track-down memory - // leaks as a belt-and-braces approach, however this prevents our DOM node - // hunter from looking in all the nooks and crannies, so it's better if we - // can be leak-free without - /* - delete this.display; - delete this.outputPanel; - delete this.tooltipPanel; - */ + CommandUtils.destroyRequisition(this.requisition, this.target); + this.target = undefined; }; /** @@ -623,8 +645,9 @@ DeveloperToolbar.prototype.handleEvent = function(ev) { if (ev.type == "TabSelect" || ev.type == "load") { if (this.visible) { - this.display.reattach({ - contentDocument: this._chromeWindow.gBrowser.contentDocumentAsCPOW + this.target = TargetFactory.forTab(this._chromeWindow.gBrowser.selectedTab); + gcliInit.getSystem(this.target).then(system => { + this.requisition.system = system; }); if (ev.type == "TabSelect") { @@ -751,7 +774,7 @@ * Creating a OutputPanel is asynchronous */ function OutputPanel() { - throw new Error('Use OutputPanel.create()'); + throw new Error("Use OutputPanel.create()"); } /** @@ -838,8 +861,8 @@ this._copyTheme(); this._div = this.document.getElementById("gcli-output-root"); - this._div.classList.add('gcli-row-out'); - this._div.setAttribute('aria-live', 'assertive'); + this._div.classList.add("gcli-row-out"); + this._div.setAttribute("aria-live", "assertive"); let styles = this._toolbar.ownerDocument.defaultView .getComputedStyle(this._toolbar); @@ -992,8 +1015,8 @@ } if (this.displayedOutput.data != null) { - let context = this._devtoolbar.display.requisition.conversionContext; - this.displayedOutput.convert('dom', context).then(node => { + let context = this._devtoolbar.requisition.conversionContext; + this.displayedOutput.convert("dom", context).then(node => { if (node == null) { return; } @@ -1002,9 +1025,9 @@ this._div.removeChild(this._div.firstChild); } - var links = node.querySelectorAll('*[href]'); + var links = node.querySelectorAll("*[href]"); for (var i = 0; i < links.length; i++) { - links[i].setAttribute('target', '_blank'); + links[i].setAttribute("target", "_blank"); } this._div.appendChild(node); @@ -1071,7 +1094,7 @@ * Creating a TooltipPanel is asynchronous */ function TooltipPanel() { - throw new Error('Use TooltipPanel.create()'); + throw new Error("Use TooltipPanel.create()"); } /** diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/inplace-editor.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/inplace-editor.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/inplace-editor.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/inplace-editor.js 2015-04-24 19:30:57.000000000 +0000 @@ -882,6 +882,14 @@ increment *= smallIncrement; } + // Use default cursor movement rather than providing auto-suggestions. + if (aEvent.keyCode === Ci.nsIDOMKeyEvent.DOM_VK_HOME + || aEvent.keyCode === Ci.nsIDOMKeyEvent.DOM_VK_END + || aEvent.keyCode === Ci.nsIDOMKeyEvent.DOM_VK_PAGE_UP + || aEvent.keyCode === Ci.nsIDOMKeyEvent.DOM_VK_PAGE_DOWN) { + this._preventSuggestions = true; + } + let cycling = false; if (increment && this._incrementValue(increment) ) { this._updateSize(); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_filter-editor-08.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_filter-editor-08.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_filter-editor-08.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_filter-editor-08.js 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,82 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Tests the Filter Editor Widget inputs increase/decrease value using +// arrow keys, applying multiplier using alt/shift on number-type filters + +const TEST_URI = "chrome://browser/content/devtools/filter-frame.xhtml"; +const {CSSFilterEditorWidget} = require("devtools/shared/widgets/FilterWidget"); + +const FAST_VALUE_MULTIPLIER = 10; +const SLOW_VALUE_MULTIPLIER = 0.1; +const DEFAULT_VALUE_MULTIPLIER = 1; + +add_task(function*() { + yield promiseTab("about:blank"); + let [host, win, doc] = yield createHost("bottom", TEST_URI); + + const container = doc.querySelector("#container"); + const initialValue = "blur(2px)"; + let widget = new CSSFilterEditorWidget(container, initialValue); + + let value = 2; + + triggerKey = triggerKey.bind(widget); + + info("Test simple arrow keys"); + triggerKey(40); + + value -= DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), `${value}px`, + "Should decrease value using down arrow"); + + triggerKey(38); + + value += DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), `${value}px`, + "Should decrease value using down arrow"); + + info("Test shift key multiplier"); + triggerKey(38, "shiftKey"); + + value += FAST_VALUE_MULTIPLIER; + is(widget.getValueAt(0), `${value}px`, + "Should increase value by fast multiplier using up arrow"); + + triggerKey(40, "shiftKey"); + + value -= FAST_VALUE_MULTIPLIER; + is(widget.getValueAt(0), `${value}px`, + "Should decrease value by fast multiplier using down arrow"); + + info("Test alt key multiplier"); + triggerKey(38, "altKey"); + + value += SLOW_VALUE_MULTIPLIER; + is(widget.getValueAt(0), `${value}px`, + "Should increase value by slow multiplier using up arrow"); + + triggerKey(40, "altKey"); + + value -= SLOW_VALUE_MULTIPLIER; + is(widget.getValueAt(0), `${value}px`, + "Should decrease value by slow multiplier using down arrow"); + + triggerKey = null; +}); + +// Triggers the specified keyCode and modifier key on +// first filter's input +function triggerKey(key, modifier) { + const filter = this.el.querySelector(".filters").children[0]; + const input = filter.querySelector("input"); + + this._keyDown({ + target: input, + keyCode: key, + [modifier]: true, + preventDefault: function() {} + }); +} diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_filter-editor-09.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_filter-editor-09.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_filter-editor-09.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_filter-editor-09.js 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,123 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Tests the Filter Editor Widget inputs increase/decrease value when cursor is +// on a number using arrow keys, applying multiplier using alt/shift on strings + +const TEST_URI = "chrome://browser/content/devtools/filter-frame.xhtml"; +const {CSSFilterEditorWidget} = require("devtools/shared/widgets/FilterWidget"); + +const FAST_VALUE_MULTIPLIER = 10; +const SLOW_VALUE_MULTIPLIER = 0.1; +const DEFAULT_VALUE_MULTIPLIER = 1; + +add_task(function*() { + yield promiseTab("about:blank"); + let [host, win, doc] = yield createHost("bottom", TEST_URI); + + const container = doc.querySelector("#container"); + const initialValue = "drop-shadow(rgb(0, 0, 0) 1px 1px 0px)"; + let widget = new CSSFilterEditorWidget(container, initialValue); + widget.el.querySelector("input").setSelectionRange(13, 13); + + let value = 1; + + triggerKey = triggerKey.bind(widget); + + info("Test simple arrow keys"); + triggerKey(40); + + value -= DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should decrease value using down arrow"); + + triggerKey(38); + + value += DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should decrease value using down arrow"); + + info("Test shift key multiplier"); + triggerKey(38, "shiftKey"); + + value += FAST_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should increase value by fast multiplier using up arrow"); + + triggerKey(40, "shiftKey"); + + value -= FAST_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should decrease value by fast multiplier using down arrow"); + + info("Test alt key multiplier"); + triggerKey(38, "altKey"); + + value += SLOW_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should increase value by slow multiplier using up arrow"); + + triggerKey(40, "altKey"); + + value -= SLOW_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should decrease value by slow multiplier using down arrow"); + + triggerKey(40, "shiftKey"); + + value -= FAST_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should decrease to negative"); + + triggerKey(40); + + value -= DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should decrease negative numbers correctly"); + + triggerKey(38); + + value += DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should increase negative values correctly"); + + triggerKey(40, "altKey"); + triggerKey(40, "altKey"); + + value -= SLOW_VALUE_MULTIPLIER * 2; + is(widget.getValueAt(0), val(value), + "Should decrease float numbers correctly"); + + triggerKey(38, "altKey"); + + value += SLOW_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should increase float numbers correctly"); + + triggerKey = null; +}); + +// Triggers the specified keyCode and modifier key on +// first filter's input +function triggerKey(key, modifier) { + const filter = this.el.querySelector(".filters").children[0]; + const input = filter.querySelector("input"); + + this._keyDown({ + target: input, + keyCode: key, + [modifier]: true, + preventDefault: function() {} + }); +} + +function val(value) { + let v = value.toFixed(1); + + if (v.indexOf(".0") > -1) { + v = v.slice(0, -2); + } + return `rgb(0, 0, 0) ${v}px 1px 0px`; +} diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_filter-editor-10.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_filter-editor-10.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_filter-editor-10.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_filter-editor-10.js 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,87 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Tests the Filter Editor Widget inputs increase/decrease value when cursor is +// on a number using arrow keys if cursor is behind/mid/after the number strings + +const TEST_URI = "chrome://browser/content/devtools/filter-frame.xhtml"; +const {CSSFilterEditorWidget} = require("devtools/shared/widgets/FilterWidget"); + +const FAST_VALUE_MULTIPLIER = 10; +const SLOW_VALUE_MULTIPLIER = 0.1; +const DEFAULT_VALUE_MULTIPLIER = 1; + +add_task(function*() { + yield promiseTab("about:blank"); + let [host, win, doc] = yield createHost("bottom", TEST_URI); + + const container = doc.querySelector("#container"); + const initialValue = "drop-shadow(rgb(0, 0, 0) 10px 1px 0px)"; + let widget = new CSSFilterEditorWidget(container, initialValue); + const input = widget.el.querySelector("input"); + + let value = 10; + + triggerKey = triggerKey.bind(widget); + + info("Test increment/decrement of string-type numbers without selection"); + + input.setSelectionRange(14, 14); + triggerKey(40); + + value -= DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should work with cursor in the middle of number"); + + input.setSelectionRange(13, 13); + triggerKey(38); + + value += DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should work with cursor before the number"); + + input.setSelectionRange(15, 15); + triggerKey(40); + + value -= DEFAULT_VALUE_MULTIPLIER; + is(widget.getValueAt(0), val(value), + "Should work with cursor after the number"); + + info("Test increment/decrement of string-type numbers with a selection"); + + input.setSelectionRange(13, 15); + triggerKey(38); + input.setSelectionRange(13, 18); + triggerKey(38); + + value += DEFAULT_VALUE_MULTIPLIER * 2; + is(widget.getValueAt(0), val(value), + "Should work if a there is a selection, starting with the number"); + + triggerKey = null; +}); + +// Triggers the specified keyCode and modifier key on +// first filter's input +function triggerKey(key, modifier) { + const filter = this.el.querySelector(".filters").children[0]; + const input = filter.querySelector("input"); + + this._keyDown({ + target: input, + keyCode: key, + [modifier]: true, + preventDefault: function() {} + }); +} + +function val(value) { + let v = value.toFixed(1); + + if (v.indexOf(".0") > -1) { + v = v.slice(0, -2); + } + return `rgb(0, 0, 0) ${v}px 1px 0px`; +} diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser.ini thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser.ini --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser.ini 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser.ini 2015-04-24 19:30:57.000000000 +0000 @@ -27,6 +27,9 @@ [browser_filter-editor-05.js] [browser_filter-editor-06.js] [browser_filter-editor-07.js] +[browser_filter-editor-08.js] +[browser_filter-editor-09.js] +[browser_filter-editor-10.js] [browser_flame-graph-01.js] [browser_flame-graph-02.js] [browser_flame-graph-03a.js] diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_telemetry_button_eyedropper.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_telemetry_button_eyedropper.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_telemetry_button_eyedropper.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_telemetry_button_eyedropper.js 2015-04-24 19:30:57.000000000 +0000 @@ -15,20 +15,24 @@ info("inspector opened"); info("testing the eyedropper button"); - testButton(toolbox, Telemetry); + yield testButton(toolbox, Telemetry); stopRecordingTelemetryLogs(Telemetry); yield gDevTools.closeToolbox(target); gBrowser.removeCurrentTab(); }); -function testButton(toolbox, Telemetry) { +function* testButton(toolbox, Telemetry) { let button = toolbox.doc.querySelector("#command-button-eyedropper"); ok(button, "Captain, we have the eyedropper button"); + let clicked = toolbox._requisition.commandOutputManager.onOutput.once(); + info("clicking the button to open the eyedropper"); button.click(); + yield clicked; + checkResults("_EYEDROPPER_", Telemetry); } diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_toolbar_tooltip.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_toolbar_tooltip.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/test/browser_toolbar_tooltip.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/test/browser_toolbar_tooltip.js 2015-04-24 19:30:57.000000000 +0000 @@ -33,25 +33,25 @@ add_task(function* testDimensions() { let tooltipPanel = DeveloperToolbar.tooltipPanel; - DeveloperToolbar.display.focusManager.helpRequest(); - yield DeveloperToolbar.display.inputter.setInput('help help'); + DeveloperToolbar.focusManager.helpRequest(); + yield DeveloperToolbar.inputter.setInput('help help'); - DeveloperToolbar.display.inputter.setCursor({ start: 'help help'.length }); + DeveloperToolbar.inputter.setCursor({ start: 'help help'.length }); is(tooltipPanel._dimensions.start, 'help '.length, 'search param start, when cursor at end'); ok(getLeftMargin() > 30, 'tooltip offset, when cursor at end') - DeveloperToolbar.display.inputter.setCursor({ start: 'help'.length }); + DeveloperToolbar.inputter.setCursor({ start: 'help'.length }); is(tooltipPanel._dimensions.start, 0, 'search param start, when cursor at end of command'); ok(getLeftMargin() > 9, 'tooltip offset, when cursor at end of command') - DeveloperToolbar.display.inputter.setCursor({ start: 'help help'.length - 1 }); + DeveloperToolbar.inputter.setCursor({ start: 'help help'.length - 1 }); is(tooltipPanel._dimensions.start, 'help '.length, 'search param start, when cursor at penultimate position'); ok(getLeftMargin() > 30, 'tooltip offset, when cursor at penultimate position') - DeveloperToolbar.display.inputter.setCursor({ start: 0 }); + DeveloperToolbar.inputter.setCursor({ start: 0 }); is(tooltipPanel._dimensions.start, 0, 'search param start, when cursor at start'); ok(getLeftMargin() > 9, 'tooltip offset, when cursor at start') @@ -63,19 +63,36 @@ Services.prefs.setCharPref(PREF_DEVTOOLS_THEME, "dark"); - yield DeveloperToolbar.display.inputter.setInput(""); - yield DeveloperToolbar.display.inputter.setInput("help help"); + yield DeveloperToolbar.inputter.setInput(""); + yield DeveloperToolbar.inputter.setInput("help help"); is(tooltipPanel.document.documentElement.getAttribute("devtoolstheme"), "dark", "Tooltip panel has correct theme"); Services.prefs.setCharPref(PREF_DEVTOOLS_THEME, "light"); - yield DeveloperToolbar.display.inputter.setInput(""); - yield DeveloperToolbar.display.inputter.setInput("help help"); + yield DeveloperToolbar.inputter.setInput(""); + yield DeveloperToolbar.inputter.setInput("help help"); is(tooltipPanel.document.documentElement.getAttribute("devtoolstheme"), "light", "Tooltip panel has correct theme"); }); + +add_task(function* hideToolbar() { + info("Ending browser_toolbar_tooltip.js"); + yield DeveloperToolbar.inputter.setInput(''); + + ok(DeveloperToolbar.visible, "DeveloperToolbar is visible in hideToolbar"); + + info("Hide toolbar"); + let hidePromise = observeOnce(DeveloperToolbar.NOTIFICATIONS.HIDE); + document.getElementById("Tools:DevToolbar").doCommand(); + yield hidePromise; + + ok(!DeveloperToolbar.visible, "DeveloperToolbar is not visible in hideToolbar"); + + info("Done test"); +}); + function getLeftMargin() { let style = DeveloperToolbar.tooltipPanel._panel.style.marginLeft; return parseInt(style.slice(0, -2), 10); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/widgets/FilterWidget.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/widgets/FilterWidget.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/widgets/FilterWidget.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/widgets/FilterWidget.js 2015-04-24 19:30:57.000000000 +0000 @@ -113,6 +113,7 @@ this._mouseMove = this._mouseMove.bind(this); this._mouseUp = this._mouseUp.bind(this); this._mouseDown = this._mouseDown.bind(this); + this._keyDown = this._keyDown.bind(this); this._input = this._input.bind(this); this._initMarkup(); @@ -195,6 +196,7 @@ this.addButton.addEventListener("click", this._addButtonClick); this.list.addEventListener("click", this._removeButtonClick); this.list.addEventListener("mousedown", this._mouseDown); + this.list.addEventListener("keydown", this._keyDown); // These events are event delegators for // drag-drop re-ordering and label-dragging @@ -205,9 +207,77 @@ this.list.addEventListener("input", this._input); }, + _getFilterElementIndex: function(el) { + return [...this.list.children].indexOf(el); + }, + + _keyDown: function(e) { + if (e.target.tagName.toLowerCase() !== "input" || + (e.keyCode !== 40 && e.keyCode !== 38)) { + return; + } + let input = e.target; + + const direction = e.keyCode === 40 ? -1 : 1; + + let multiplier = DEFAULT_VALUE_MULTIPLIER; + if (e.altKey) { + multiplier = SLOW_VALUE_MULTIPLIER; + } else if (e.shiftKey) { + multiplier = FAST_VALUE_MULTIPLIER; + } + + const filterEl = e.target.closest(".filter"); + const index = this._getFilterElementIndex(filterEl); + const filter = this.filters[index]; + + // Filters that have units are number-type filters. For them, + // the value can be incremented/decremented simply. + // For other types of filters (e.g. drop-shadow) we need to check + // if the keypress happened close to a number first. + if (filter.unit) { + let startValue = parseFloat(e.target.value); + let value = startValue + direction * multiplier; + + const [min, max] = this._definition(filter.name).range; + value = value < min ? min : + value > max ? max : value; + + input.value = fixFloat(value); + + this.updateValueAt(index, value); + } else { + let selectionStart = input.selectionStart; + let num = getNeighbourNumber(input.value, selectionStart); + if (!num) { + return; + } + + let {start, end, value} = num; + + let split = input.value.split(""); + let computed = fixFloat(value + direction * multiplier), + dotIndex = computed.indexOf(".0"); + if (dotIndex > -1) { + computed = computed.slice(0, -2); + + selectionStart = selectionStart > start + dotIndex ? + start + dotIndex : + selectionStart; + } + split.splice(start, end - start, computed); + + value = split.join(""); + input.value = value; + this.updateValueAt(index, value); + input.setSelectionRange(selectionStart, selectionStart); + } + e.preventDefault(); + }, + _input: function(e) { let filterEl = e.target.closest(".filter"), - index = [...this.list.children].indexOf(filterEl), + index = this._getFilterElementIndex(filterEl), filter = this.filters[index], def = this._definition(filter.name); @@ -231,7 +301,7 @@ } else if (e.target.classList.contains("devtools-draglabel")) { let label = e.target, input = filterEl.querySelector("input"), - index = [...this.list.children].indexOf(filterEl); + index = this._getFilterElementIndex(filterEl); this._dragging = { index, label, input, @@ -273,7 +343,7 @@ } let filterEl = e.target.closest(".filter"); - let index = [...this.list.children].indexOf(filterEl); + let index = this._getFilterElementIndex(filterEl); this.removeAt(index); }, @@ -622,6 +692,7 @@ this.addButton.removeEventListener("click", this._addButtonClick); this.list.removeEventListener("click", this._removeButtonClick); this.list.removeEventListener("mousedown", this._mouseDown); + this.list.removeEventListener("keydown", this._keyDown); // These events are used for drag drop re-ordering this.win.removeEventListener("mousemove", this._mouseMove); @@ -718,3 +789,40 @@ return filters; } + +/** + * Finds neighbour number characters of an index in a string + * the numbers may be floats (containing dots) + * It's assumed that the value given to this function is a valid number + * + * @param {String} string + * The string containing numbers + * @param {Number} index + * The index to look for neighbours for + * @return {Object} + * returns null if no number is found + * value: The number found + * start: The number's starting index + * end: The number's ending index + */ +function getNeighbourNumber(string, index) { + if (!/\d/.test(string)) { + return null; + } + + let left = /-?[0-9.]*$/.exec(string.slice(0, index)), + right = /-?[0-9.]*/.exec(string.slice(index)); + + left = left ? left[0] : ""; + right = right ? right[0] : ""; + + if (!right && !left) { + return null; + } + + return { + value: fixFloat(left + right, true), + start: index - left.length, + end: index + right.length + }; +} diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/widgets/Tooltip.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/widgets/Tooltip.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/shared/widgets/Tooltip.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/shared/widgets/Tooltip.js 2015-04-24 19:30:57.000000000 +0000 @@ -453,8 +453,6 @@ if (res && res.then) { return res.then(arg => { return arg instanceof Ci.nsIDOMNode ? arg : target; - }, () => { - return false; }); } else { let newTarget = res instanceof Ci.nsIDOMNode ? res : target; diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/editor.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/editor.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/editor.js 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/editor.js 2015-04-24 19:30:57.000000000 +0000 @@ -220,6 +220,11 @@ cm.replaceSelection(" ".repeat(num), "end", "+input"); }; + // Allow add-ons to inject scripts for their editor instances + if (!this.config.externalScripts) { + this.config.externalScripts = []; + } + events.decorate(this); } @@ -258,9 +263,11 @@ if (!this.config.themeSwitching) win.document.documentElement.setAttribute("force-theme", "light"); - CM_SCRIPTS.forEach((url) => - Services.scriptloader.loadSubScript(url, win, "utf8")); - + let scriptsToInject = CM_SCRIPTS.concat(this.config.externalScripts); + scriptsToInject.forEach((url) => { + if (url.startsWith("chrome://")) + Services.scriptloader.loadSubScript(url, win, "utf8"); + }); // Replace the propertyKeywords, colorKeywords and valueKeywords // properties of the CSS MIME type with the values provided by Gecko. let cssSpec = win.CodeMirror.resolveMode("text/css"); @@ -335,6 +342,11 @@ this._prefObserver.on(ENABLE_CODE_FOLDING, this.reloadPreferences); this.reloadPreferences(); + + win.editor = this; + let editorReadyEvent = new win.CustomEvent("editorReady"); + win.dispatchEvent(editorReadyEvent); + def.resolve(); }; diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/browser_editor_script_injection.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/browser_editor_script_injection.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/browser_editor_script_injection.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/browser_editor_script_injection.js 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,26 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test the externalScripts option, which allows custom language modes or +// other scripts to be injected into the editor window. See Bug 1089428. + +"use strict"; + +add_task(function*() { + yield runTest(); +}); + +function* runTest() { + const baseURL = "chrome://mochitests/content/browser/browser/devtools/sourceeditor/test" + const injectedText = "Script successfully injected !"; + + let {ed, win} = yield setup(null, { + mode: "ruby", + externalScripts: [`${baseURL}/cm_script_injection_test.js`, + `${baseURL}/cm_mode_ruby.js`] + }); + + is(ed.getText(), injectedText, "The text has been injected"); + is(ed.getOption("mode"), "ruby", "The ruby mode is correctly set"); + teardown(ed, win); +} \ No newline at end of file diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/browser.ini thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/browser.ini --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/browser.ini 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/browser.ini 2015-04-24 19:30:57.000000000 +0000 @@ -9,6 +9,8 @@ cm_mode_test.css cm_mode_test.js cm_multi_test.js + cm_mode_ruby.js + cm_script_injection_test.js cm_search_test.js cm_sublime_test.js cm_test.js @@ -31,6 +33,7 @@ [browser_editor_markers.js] [browser_editor_movelines.js] [browser_editor_prefs.js] +[browser_editor_script_injection.js] [browser_editor_addons.js] [browser_codemirror.js] [browser_css_autocompletion.js] diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/cm_mode_ruby.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/cm_mode_ruby.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/cm_mode_ruby.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/cm_mode_ruby.js 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,285 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { +"use strict"; + +CodeMirror.defineMode("ruby", function(config) { + function wordObj(words) { + var o = {}; + for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; + return o; + } + var keywords = wordObj([ + "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else", + "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or", + "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", + "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc", + "caller", "lambda", "proc", "public", "protected", "private", "require", "load", + "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__" + ]); + var indentWords = wordObj(["def", "class", "case", "for", "while", "module", "then", + "catch", "loop", "proc", "begin"]); + var dedentWords = wordObj(["end", "until"]); + var matching = {"[": "]", "{": "}", "(": ")"}; + var curPunc; + + function chain(newtok, stream, state) { + state.tokenize.push(newtok); + return newtok(stream, state); + } + + function tokenBase(stream, state) { + curPunc = null; + if (stream.sol() && stream.match("=begin") && stream.eol()) { + state.tokenize.push(readBlockComment); + return "comment"; + } + if (stream.eatSpace()) return null; + var ch = stream.next(), m; + if (ch == "`" || ch == "'" || ch == '"') { + return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state); + } else if (ch == "/") { + var currentIndex = stream.current().length; + if (stream.skipTo("/")) { + var search_till = stream.current().length; + stream.backUp(stream.current().length - currentIndex); + var balance = 0; // balance brackets + while (stream.current().length < search_till) { + var chchr = stream.next(); + if (chchr == "(") balance += 1; + else if (chchr == ")") balance -= 1; + if (balance < 0) break; + } + stream.backUp(stream.current().length - currentIndex); + if (balance == 0) + return chain(readQuoted(ch, "string-2", true), stream, state); + } + return "operator"; + } else if (ch == "%") { + var style = "string", embed = true; + if (stream.eat("s")) style = "atom"; + else if (stream.eat(/[WQ]/)) style = "string"; + else if (stream.eat(/[r]/)) style = "string-2"; + else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; } + var delim = stream.eat(/[^\w\s=]/); + if (!delim) return "operator"; + if (matching.propertyIsEnumerable(delim)) delim = matching[delim]; + return chain(readQuoted(delim, style, embed, true), stream, state); + } else if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) { + return chain(readHereDoc(m[1]), stream, state); + } else if (ch == "0") { + if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/); + else if (stream.eat("b")) stream.eatWhile(/[01]/); + else stream.eatWhile(/[0-7]/); + return "number"; + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/); + return "number"; + } else if (ch == "?") { + while (stream.match(/^\\[CM]-/)) {} + if (stream.eat("\\")) stream.eatWhile(/\w/); + else stream.next(); + return "string"; + } else if (ch == ":") { + if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state); + if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state); + + // :> :>> :< :<< are valid symbols + if (stream.eat(/[\<\>]/)) { + stream.eat(/[\<\>]/); + return "atom"; + } + + // :+ :- :/ :* :| :& :! are valid symbols + if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) { + return "atom"; + } + + // Symbols can't start by a digit + if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) { + stream.eatWhile(/[\w$\xa1-\uffff]/); + // Only one ? ! = is allowed and only as the last character + stream.eat(/[\?\!\=]/); + return "atom"; + } + return "operator"; + } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) { + stream.eat("@"); + stream.eatWhile(/[\w\xa1-\uffff]/); + return "variable-2"; + } else if (ch == "$") { + if (stream.eat(/[a-zA-Z_]/)) { + stream.eatWhile(/[\w]/); + } else if (stream.eat(/\d/)) { + stream.eat(/\d/); + } else { + stream.next(); // Must be a special global like $: or $! + } + return "variable-3"; + } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) { + stream.eatWhile(/[\w\xa1-\uffff]/); + stream.eat(/[\?\!]/); + if (stream.eat(":")) return "atom"; + return "ident"; + } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) { + curPunc = "|"; + return null; + } else if (/[\(\)\[\]{}\\;]/.test(ch)) { + curPunc = ch; + return null; + } else if (ch == "-" && stream.eat(">")) { + return "arrow"; + } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) { + var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/); + if (ch == "." && !more) curPunc = "."; + return "operator"; + } else { + return null; + } + } + + function tokenBaseUntilBrace(depth) { + if (!depth) depth = 1; + return function(stream, state) { + if (stream.peek() == "}") { + if (depth == 1) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } else { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1); + } + } else if (stream.peek() == "{") { + state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1); + } + return tokenBase(stream, state); + }; + } + function tokenBaseOnce() { + var alreadyCalled = false; + return function(stream, state) { + if (alreadyCalled) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } + alreadyCalled = true; + return tokenBase(stream, state); + }; + } + function readQuoted(quote, style, embed, unescaped) { + return function(stream, state) { + var escaped = false, ch; + + if (state.context.type === 'read-quoted-paused') { + state.context = state.context.prev; + stream.eat("}"); + } + + while ((ch = stream.next()) != null) { + if (ch == quote && (unescaped || !escaped)) { + state.tokenize.pop(); + break; + } + if (embed && ch == "#" && !escaped) { + if (stream.eat("{")) { + if (quote == "}") { + state.context = {prev: state.context, type: 'read-quoted-paused'}; + } + state.tokenize.push(tokenBaseUntilBrace()); + break; + } else if (/[@\$]/.test(stream.peek())) { + state.tokenize.push(tokenBaseOnce()); + break; + } + } + escaped = !escaped && ch == "\\"; + } + return style; + }; + } + function readHereDoc(phrase) { + return function(stream, state) { + if (stream.match(phrase)) state.tokenize.pop(); + else stream.skipToEnd(); + return "string"; + }; + } + function readBlockComment(stream, state) { + if (stream.sol() && stream.match("=end") && stream.eol()) + state.tokenize.pop(); + stream.skipToEnd(); + return "comment"; + } + + return { + startState: function() { + return {tokenize: [tokenBase], + indented: 0, + context: {type: "top", indented: -config.indentUnit}, + continuedLine: false, + lastTok: null, + varList: false}; + }, + + token: function(stream, state) { + if (stream.sol()) state.indented = stream.indentation(); + var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype; + var thisTok = curPunc; + if (style == "ident") { + var word = stream.current(); + style = state.lastTok == "." ? "property" + : keywords.propertyIsEnumerable(stream.current()) ? "keyword" + : /^[A-Z]/.test(word) ? "tag" + : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def" + : "variable"; + if (style == "keyword") { + thisTok = word; + if (indentWords.propertyIsEnumerable(word)) kwtype = "indent"; + else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent"; + else if ((word == "if" || word == "unless") && stream.column() == stream.indentation()) + kwtype = "indent"; + else if (word == "do" && state.context.indented < state.indented) + kwtype = "indent"; + } + } + if (curPunc || (style && style != "comment")) state.lastTok = thisTok; + if (curPunc == "|") state.varList = !state.varList; + + if (kwtype == "indent" || /[\(\[\{]/.test(curPunc)) + state.context = {prev: state.context, type: curPunc || style, indented: state.indented}; + else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev) + state.context = state.context.prev; + + if (stream.eol()) + state.continuedLine = (curPunc == "\\" || style == "operator"); + return style; + }, + + indent: function(state, textAfter) { + if (state.tokenize[state.tokenize.length-1] != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0); + var ct = state.context; + var closing = ct.type == matching[firstChar] || + ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter); + return ct.indented + (closing ? 0 : config.indentUnit) + + (state.continuedLine ? config.indentUnit : 0); + }, + + electricChars: "}de", // enD and rescuE + lineComment: "#" + }; +}); + +CodeMirror.defineMIME("text/x-ruby", "ruby"); + +}); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/cm_script_injection_test.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/cm_script_injection_test.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/sourceeditor/test/cm_script_injection_test.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/sourceeditor/test/cm_script_injection_test.js 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,3 @@ +window.addEventListener("editorReady", function(event) { + editor.setText("Script successfully injected !"); +}); \ No newline at end of file diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/styleeditor-commands.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/styleeditor-commands.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/styleeditor-commands.js 2015-04-22 13:05:29.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/styleeditor-commands.js 2015-04-24 19:30:57.000000000 +0000 @@ -4,12 +4,30 @@ "use strict"; -const gcli = require("gcli/index"); +const l10n = require("gcli/l10n"); +/** + * The `edit` command opens the toolbox to the style editor, with a given + * stylesheet open. + * + * This command is tricky. The 'edit' command uses the toolbox, so it's + * clearly runAt:client, but it uses the 'resource' type which accesses the + * DOM, so it must also be runAt:server. + * + * Our solution is to have the command technically be runAt:server, but to not + * actually do anything other than basically `return args;`, and have the + * converter (all converters are runAt:client) do the actual work of opening + * a toolbox. + * + * For alternative solutions that we considered, see the comment on commit + * 2645af7. + */ exports.items = [{ + item: "command", + runAt: "server", name: "edit", - description: gcli.lookup("editDesc"), - manual: gcli.lookup("editManual2"), + description: l10n.lookup("editDesc"), + manual: l10n.lookup("editManual2"), params: [ { name: 'resource', @@ -17,7 +35,7 @@ name: 'resource', include: 'text/css' }, - description: gcli.lookup("editResourceDesc") + description: l10n.lookup("editResourceDesc") }, { name: "line", @@ -27,15 +45,23 @@ min: 1, step: 10 }, - description: gcli.lookup("editLineToJumpToDesc") + description: l10n.lookup("editLineToJumpToDesc") } ], + returnType: "editArgs", + exec: args => { + return { href: args.resource.name, line: args.line }; + } +}, { + item: "converter", + from: "editArgs", + to: "dom", exec: function(args, context) { let target = context.environment.target; let gDevTools = require("resource:///modules/devtools/gDevTools.jsm").gDevTools; return gDevTools.showToolbox(target, "styleeditor").then(function(toolbox) { let styleEditor = toolbox.getCurrentPanel(); - styleEditor.selectStyleSheet(args.resource.element, args.line); + styleEditor.selectStyleSheet(args.href, args.line); return null; }); } diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/styleeditor-panel.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/styleeditor-panel.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/styleeditor-panel.js 2015-04-22 13:05:29.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/styleeditor-panel.js 2015-04-24 19:30:57.000000000 +0000 @@ -61,9 +61,9 @@ // Initialize the UI this.UI = new StyleEditorUI(this._debuggee, this.target, this._panelDoc); + this.UI.on("error", this._showError); yield this.UI.initialize(); - this.UI.on("error", this._showError); this.isReady = true; return this; diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/StyleEditorUI.jsm thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/StyleEditorUI.jsm --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/StyleEditorUI.jsm 2015-04-22 13:05:28.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/StyleEditorUI.jsm 2015-04-24 19:30:57.000000000 +0000 @@ -239,7 +239,11 @@ this._clear(); for (let sheet of styleSheets) { - yield this._addStyleSheet(sheet); + try { + yield this._addStyleSheet(sheet); + } catch (e) { + this.emit("error", { key: LOAD_ERROR }); + } } this._root.classList.remove("loading"); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser.ini thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser.ini --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser.ini 2015-04-22 13:05:29.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser.ini 2015-04-24 19:30:57.000000000 +0000 @@ -18,6 +18,7 @@ media-rules.css media-rules-sourcemaps.html minified.html + missing.html nostyle.html pretty.css resources_inpage.jsi @@ -66,6 +67,7 @@ [browser_styleeditor_loading.js] [browser_styleeditor_media_sidebar.js] [browser_styleeditor_media_sidebar_sourcemaps.js] +[browser_styleeditor_missing_stylesheet.js] [browser_styleeditor_navigate.js] [browser_styleeditor_new.js] [browser_styleeditor_nostyle.js] diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_cmd_edit.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_cmd_edit.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_cmd_edit.js 2015-04-22 13:05:29.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_cmd_edit.js 2015-04-24 19:30:57.000000000 +0000 @@ -176,14 +176,6 @@ setup: "edit css#style2", check: { input: "edit css#style2", - args: { - resource: { - value: function(resource) { - let style2 = options.window.document.getElementById("style2"); - return resource.element.ownerNode == style2; - } - } - } }, exec: { output: "" } }, diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_missing_stylesheet.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_missing_stylesheet.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_missing_stylesheet.js 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_missing_stylesheet.js 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,30 @@ +"use strict"; +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Checks that the style editor manages to finalize its stylesheet loading phase +// even if one stylesheet is missing, and that an error message is displayed. + +const TESTCASE_URI = TEST_BASE + "missing.html"; + +add_task(function* () { + let { ui, toolbox, panel } = yield openStyleEditorForURL(TESTCASE_URI); + + // Note that we're not testing for a specific number of stylesheet editors + // below because the test-page is loaded with chrome:// URL and, right now, + // that means UA stylesheets are shown. So we avoid hardcoding the number of + // stylesheets here. + ok(ui.editors.length, "The UI contains style sheets."); + + let rootEl = panel.panelWindow.document.getElementById("style-editor-chrome"); + ok(!rootEl.classList.contains("loading"), "The loading indicator is hidden"); + + let notifBox = toolbox.getNotificationBox(); + let notif = notifBox.currentNotification; + ok(notif, "The notification box contains a message"); + ok(notif.label.indexOf("Style sheet could not be loaded") !== -1, + "The error message is the correct one"); + ok(notif.label.indexOf("missing-stylesheet.css") !== -1, + "The error message contains the missing stylesheet's URL"); +}); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_opentab.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_opentab.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_opentab.js 2015-04-22 13:05:29.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/browser_styleeditor_opentab.js 2015-04-24 19:30:57.000000000 +0000 @@ -5,11 +5,9 @@ // A test to check the 'Open Link in new tab' functionality in the // context menu item for stylesheets (bug 992947). const TESTCASE_URI = TEST_BASE_HTTPS + "simple.html"; -waitForExplicitFinish(); add_task(function*() { - let panel = yield addTabAndOpenStyleEditors(2, null, TESTCASE_URI); - let ui = panel.UI; + let { ui } = yield openStyleEditorForURL(TESTCASE_URI); yield rightClickStyleSheet(ui, ui.editors[0]); is(ui._openLinkNewTabItem.getAttribute("disabled"), "false", "The menu item is not disabled"); @@ -73,7 +71,7 @@ EventUtils.synthesizeMouseAtCenter( editor.summary.querySelector(".stylesheet-name"), {button: 2, type: "contextmenu"}, - gPanelWindow); + ui._window); return defer.promise; } @@ -91,7 +89,7 @@ EventUtils.synthesizeMouseAtCenter( editor.summary.querySelector(".stylesheet-name"), {button: 2, type: "contextmenu"}, - gPanelWindow); + ui._window); return defer.promise; } @@ -109,7 +107,7 @@ EventUtils.synthesizeMouseAtCenter( ui._panelDoc.querySelector("#splitview-tpl-summary-stylesheet"), {button: 2, type: "contextmenu"}, - gPanelWindow); + ui._window); return defer.promise; } diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/head.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/head.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/head.js 2015-04-22 13:05:29.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/head.js 2015-04-24 19:30:57.000000000 +0000 @@ -12,7 +12,6 @@ let {console} = Cu.import("resource://gre/modules/devtools/Console.jsm", {}); let {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {}); -let gPanelWindow; // Import the GCLI test helper @@ -64,7 +63,6 @@ function* cleanup() { - gPanelWindow = null; while (gBrowser.tabs.length > 1) { let target = TargetFactory.forTab(gBrowser.selectedTab); yield gDevTools.closeToolbox(target); @@ -87,56 +85,6 @@ return { tab, toolbox, panel, ui }; }); -function addTabAndOpenStyleEditors(count, callback, uri) { - let deferred = promise.defer(); - let currentCount = 0; - let panel; - addTabAndCheckOnStyleEditorAdded(p => panel = p, function (editor) { - currentCount++; - info(currentCount + " of " + count + " editors opened: " - + editor.styleSheet.href); - if (currentCount == count) { - if (callback) { - callback(panel); - } - deferred.resolve(panel); - } - }); - - if (uri) { - content.location = uri; - } - return deferred.promise; -} - -function addTabAndCheckOnStyleEditorAdded(callbackOnce, callbackOnAdded) { - gBrowser.selectedTab = gBrowser.addTab(); - gBrowser.selectedBrowser.addEventListener("load", function onLoad() { - gBrowser.selectedBrowser.removeEventListener("load", onLoad, true); - openStyleEditorInWindow(window, function (panel) { - // Execute the individual callback with the panel argument. - callbackOnce(panel); - // Report editors that already opened while loading. - for (let editor of panel.UI.editors) { - callbackOnAdded(editor); - } - // Report new editors added afterwards. - panel.UI.on("editor-added", (event, editor) => callbackOnAdded(editor)); - }); - }, true); -} - -function openStyleEditorInWindow(win, callback) { - let target = TargetFactory.forTab(win.gBrowser.selectedTab); - win.gDevTools.showToolbox(target, "styleeditor").then(function(toolbox) { - let panel = toolbox.getCurrentPanel(); - gPanelWindow = panel._panelWin; - - panel.UI._alwaysDisableAnimations = true; - callback(panel); - }); -} - /** * Loads shared/frame-script-utils.js in the specified tab. * diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/missing.html thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/missing.html --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/devtools/styleeditor/test/missing.html 1970-01-01 00:00:00.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/devtools/styleeditor/test/missing.html 2015-04-24 19:30:57.000000000 +0000 @@ -0,0 +1,11 @@ + + + + +&certerror.introPara1;
-&certerror.whatShouldIDo.content;
-&rights.intro;
- -&rights2.webservices-a;&rights2.webservices-b;&rights3.webservices-c;
- -&rights.locationawarebrowsing-a;&rights.locationawarebrowsing-b;
-&rights.locationawarebrowsing-term1b;
&safeb.blocked.phishingPage.shortDesc2;
-&safeb.blocked.malwarePage.shortDesc;
-&safeb.blocked.phishingPage.longDesc2;
-&safeb.blocked.malwarePage.longDesc;
-&crashprompt.message;
-
-
-
-
-
- This privacy policy explains how Mozilla Corporation (“Mozilla”), a wholly-owned subsidiary of the non-profit Mozilla Foundation, collects and uses information about users of the official Mozilla Firefox® web browser (“Firefox”). It does not apply to other Mozilla websites, products, or services. -
- -In this privacy policy, we address the following:
-"Personal Information" is information that you provide to us that personally identifies you, such as your name, phone number, or email address. Except as described below, Mozilla does not collect or require end-users of Firefox to provide Personal Information.
- -"Non-Personal Information" is information that cannot be directly associated with a specific person or entity. Non-Personal Information includes but is not limited to your computer’s configuration and the version of Firefox you use.
- -"Potentially Personal Information" is information that is Non-Personal Information in and of itself but that could be used in conjunction with other information to personally identify you. For example, Uniform Resource Locators (“URLs”) (the addresses of web pages) or Internet Protocol (“IP”) addresses (the addresses of computers on the Internet), which are Non-Personal Information in and of themselves, could be Personal Information when combined with Internet service provider (“ISP”) records.
- -“Aggregate Data” is information that is recorded about users and collected into groups so that it no longer reflects or references an individually identifiable user.
- -Like other web browsers, Firefox sends Non-Personal and Potentially Personal Information to the websites you visit when requested by the website. This may include, e.g. the type of browser you are using, the type of device you are using (desktop, mobile, touch screen), your language preference, the referring site, and your IP address. If you are viewing a video, the buffering functionality of Firefox may allow the server hosting the video to determine which sections of the video you have actually played. This information may be logged by the websites you visit and the Internet Service Provider you are using. What information is logged and how that information is used depends on the policies of each of the websites you visit and the ISPs you use.
- -Each website determines its own privacy practices for the distribution and use of this Non- Personal Information and Potentially Personal Information. If you are concerned about how a website will use this information, check out its privacy policy. To find out more about how Mozilla uses this information on its own websites, see the Mozilla Privacy Policy.
- -A cookie is information stored on your computer by a website you visit. Cookies often store your settings for a website, such as your preferred language or location. When you return to the site, Firefox sends back the cookies that belong to the site. This allows the site to present you with information customized to fit your needs. Cookies can store a wide range of information, including personally identifiable information (such as your name, home address, e-mail address, or telephone number). Because of their ability to store Personal Information, or references to such information, cookies can allow websites to track the online movements of particular individuals.
- -Firefox itself does not set any cookies on behalf of Mozilla.
- -By default, the activities of storing and sending cookies are invisible to you. However, you can change your Firefox settings to allow you to approve or deny cookie storage requests, delete stored cookies automatically when you close Firefox, and more. An article in our Firefox Knowledge Base gives you information about changing these preferences.
- -Add-ons Features. One thing that makes Firefox so flexible is the ability for you to add various add-ons, extensions, and themes to Firefox, thereby creating a custom browser that fits your needs. The following features show how Firefox provides the ability both to obtain additional add- ons easily and to protect against potentially harmful add-ons.
- -Firefox offers a Get Add-ons page of the Add-ons Manager that features popular add-ons and displays personalized recommendations based on the add-ons you already have installed. This page can be accessed by clicking (or tapping on a mobile device) on the “Get Add-ons” tab of the Firefox Add-ons Manager. To display the personalized recommendations, Firefox sends certain information to Mozilla, including the list of add-ons you have installed, Firefox version information, and your IP address. This communication only happens when the Get Add-ons area is open and can be turned off at any time by following these instructions.
-In order to keep the information displayed to you about your installed add-ons up to date, Firefox communicates with Mozilla once a day to update add-on descriptions, home pages, download counts, screenshots, and ratings. This communication includes the list of add-ons you have installed, Firefox version information, how long it took Firefox to start up, and your IP address. You can turn off this functionality at any time by following these instructions.
-If you enter keywords into the search field for the Add-ons Manager, those keywords will be sent to Mozilla in order to perform the search, along with Potentially Personal Information (such as IP address) normally transferred to perform such functionality.
-Automated Update Service. Firefox’s automatic update feature periodically checks to see if an updated version of Firefox and installed add-ons are available from Mozilla.
- -This feature sends Non-Personal Information to Mozilla, including the version of Firefox you are using, build ID and target, update channel, your language preference, and your operating system. This feature also sends Potentially Personal Information to Mozilla in the form of your IP address and a cookie that contains a unique numeric value to distinguish individual Firefox installs. Mozilla uses this information to provide you with updated versions of Firefox and to understand the usage patterns of Firefox users. We use this information to improve our products and services and to support decision making regarding feature and capacity planning.
- -Mozilla does not collect or track any Personal Information or any information about the websites you visit, and Mozilla does not release the raw information we obtain from these Firefox features to the public. We may release reports containing Aggregate Data so that our global community can make better product and design decisions. To prevent Mozilla from obtaining this information, you can turn this feature off in Firefox’s preferences. An article in our Firefox Knowledge Base gives you information about changing your preferences in non-mobile versions of Firefox.
- -Blocklist Feature. Firefox also offers a Blocklist feature. With this feature, once a day Firefox does a regularly scheduled, automatic check to see if you have any harmful add-ons or plug-ins installed. If so, this feature disables add-ons or plug-ins that Mozilla has determined contain known vulnerabilities or major user-facing issues or fatal bugs (e.g., Firefox crashes on startup or something causes an endless loop). You may view the current list of Blocklisted items. This feature sends Non-Personal Information to Mozilla, including the version of Firefox you are using, operating system version, build ID and target, update channel, and your language preference. This feature also sends Potentially Personal Information to Mozilla in the form of your IP address and a cookie. In addition, Mozilla also uses this feature to analyze Firefox usage patterns so we may improve our products and services, including planning features and capacity. Currently there is no basic user interface to disable the Blocklist feature. An article in our Firefox Knowledge Base explains how you may disable the Blocklist feature. Disabling the Blocklist feature is not recommended as it may result in using extensions known to be untrustworthy.
- -Crash-Reporting Feature (not applicable to Firefox for mobile). Firefox has a crash-reporting feature that sends a report to Mozilla when Firefox crashes. Mozilla uses the information in the crash reports to diagnose and correct the problems in Firefox that caused the crash. Though this feature starts automatically after Firefox crashes, it does not send information to Mozilla until you explicitly authorize it to do so. By default, this feature sends a variety of Non-Personal Information to Mozilla, including the stack trace (a detailed description of which parts of the Firefox code were active at the time of the crash) and the type of computer you are using. Additional information is collected by the crash reporting feature. Which crash reporting feature is used and what additional information collected by Firefox depends on which version of Firefox you’re using. For pre-3.x versions of Firefox, please see the end of this privacy policy.
- -For the current versions of Firefox, “Firefox Crash Reporter” is Firefox’s crash reporting feature. With this feature, you have the option to include Personal Information (including your email address), Potentially Personal Information (including your IP address and the URL of the site you were visiting when Firefox crashed), and a comment. Firefox Crash Reporter also sends a list of all add-ons that you were using at the time of the crash, the time since (i) the last crash, (ii) the last install, and (iii) the start-up of the program. For Firefox 3.0.0 – 3.0.5, Firefox Crash Reporter also collects Potentially Personal Information to Mozilla in the form of a unique alphanumeric value to distinguish individual Firefox installs. This value is not assigned to users of Firefox 3.0.6 and subsequent versions. Mozilla only makes Non-Personal Information (i.e., generic information about your computer, the stack trace, and any comment given by the user) available in the public reports available online at http://crash-stats.mozilla.com/.
-Location-Aware Feature. Beginning with Firefox 3.5 and all versions of Firefox for mobile, Firefox offers a Location-Aware Feature, parts of which may be provided by third-party service providers.
- -This feature remains inoperative until you visit a website that requests your location and you choose to opt in to the feature. If you elect not to, nothing happens. Each time you visit such a website, Firefox asks you if you want it to provide the site with your current location. Additionally, you may elect to have Firefox remember your choice to allow or not allow the feature for each site. Any such election is domain specific. You are able to opt out at any time of having Firefox remember your choice, just like any other preference setting.
-If you choose to allow it, the Firefox Location-Aware Feature first collects one or more of the following relevant location markers: (i) location provided by a GPS device built into or attached to your computer or device and/or geolocation services provided by the operating system; (ii) the wifi routers closest to you; (iii) cell ids of the cell phone broadcast towers closest to you; (iv) the signal strength of nearby wireless access points and/or cell phone broadcast towers; and/or (v) your computer or device’s IP address. Next, it attempts to determine your location using these location markers. Any information Firefox uses, receives or sends as part of this Location-Aware Feature is not received by any Mozilla servers or by Mozilla. Firefox does not track or remember your location. Firefox does remember a random client identifier, the temporary ID assigned by our third party provider to process your request, for two weeks.
-If your computer or device has a GPS unit or your operating system provides geolocation services and you have elected to use the location aware feature, Firefox will send your location information directly to the requesting website. If not, Firefox will send the other information described above, plus your user agent information (e.g., version of Firefox you’re using) and a temporary client identifier, to a third party geolocation services provider. That provider can determine your approximate location from such data (e.g., convert a set of WiFi signal strengths into latitude and longitude). This information is sent by Firefox over an encrypted connection and no cookies are used. Neither the domain name nor the URL of the site you’re visiting is sent to our service providers. Our providers estimate your location and return it to Firefox. Firefox provides your location information to the webpage that made the request.
-Our policy is to require third-party providers to enter licensing agreements with Mozilla, which prohibit them from releasing Personal or Potentially Personal Information to the public. We only permit our third party providers to use this information in conjunction with the service(s) they are providing to us. They are required to ensure that any information collected on our behalf is anonymized and aggregated before they are permitted to use such information to develop new features or products and services, or to improve the overall quality of any of their products and services. For example, this means that they are required to ensure that your IP address and unique identifier of your client will be stripped out before being used by any of our third party provider’s other products or features. For more information on how our geolocation services providers use information sent by Firefox, please see the privacy policy links in our list of third-party service providers.
-Please carefully consider any website or service provider's privacy practices before agreeing to share your location.
-Panorama Feature (not applicable to Firefox for mobile). Starting with Firefox 4, Firefox provides Panorama, which manages your tab experience. Your tab usage and names are not sent to Mozilla, but rather reside locally on your device. The first time you run Panorama, a video may be presented to you explaining Panorama. The video or web page is hosted by Mozilla so Mozilla receives your IP address and date and time of receiving the video.
- -Firefox Sync Feature. The Firefox Sync feature is included in versions of Firefox beginning with Version 4. Firefox Sync allows you to synchronize certain data between your computers, mobile phones, and other devices that have the Firefox browser installed, by utilizing the Firefox Sync Services. (You can also use Sync with a syncing service hosted on a non-Mozilla server set up by yourself or a third party, but in that case this policy doesn’t apply to your use of such syncing service.) Examples of data you can synchronize include browsing history, form history, bookmarks, saved passwords, preferences, and open tabs. This data (“Firefox Sync User Data”) is stored on, manipulated, and transmitted to and from Mozilla’s servers by means of your use of the Firefox Sync Services. Firefox Sync User Data is encrypted on your computer before it is sent to Mozilla’s servers, so it is not available to Mozilla in a readable form. Mozilla uses SSL/TLS technology to ensure your Firefox Sync User Data is encrypted during transit.
- -In order to utilize the Sync functionality you must register for the Firefox Sync Services. During registration you will need to provide your email address and create a username and password (collectively “Account Data”). Your Account Data will be encrypted using SSL/TLS for transit. Your password will be stored on our servers in an encrypted form called a hash. This form of encryption disguises your password on the server, but still allows us to authenticate you when you sign into the Firefox Sync Services. Certain versions of Sync also ask you to create a secret phrase. The secret phrase is stored on your computer and is not sent to the Firefox Sync servers or to Mozilla. Mozilla does not collect any other Personal Information through Firefox Sync.
- -Mozilla receives and uses the following Non-Personal and Potentially Personal Information for the purpose of providing and improving the Firefox Sync Services: IP address, username, date and time of accessing the Firefox Sync Services, user agent string information such as the type of client OS and Firefox version in use, and aggregated operational data such as access log data and how many bookmarks, history, or tabs users have collectively created and synced.
- -The Firefox Sync Services also receive the host names you have given your devices that you are syncing. These names are used to label your tabs within Firefox Sync. If you don’t want to share your devices’ names, you should consider naming your devices with fanciful names rather than your actual name. The information is transmitted using SSL. Currently, you can opt out of having your devices named in Firefox Sync by visiting the Firefox preferences pane or about:config.
- -You can disconnect from the Firefox Sync Services and have your Account Data and Firefox Sync User Data removed from our servers at any time. On your computer, go to the “Tools” menu, highlight “Sync,” and click “Disconnect.” Then go to https://services.mozilla.com/delete-account/, and submit the form to request deletion of your Account Data and Firefox Sync User Data from our servers. If you are transferring a synced device to another party (such as if you are sharing, reselling, or donating your laptop or phone) you may wish to disconnect and then remove your Sync data from your device to avoid sharing it with the device recipient.
- -Personas Feature. Firefox’s Personas feature is a theme that lets you personalize the look of your browser.
- -When you apply a Persona to your browser, Mozilla collects your IP address, the date and time you applied the Persona to your browser, and the url you used to make the application as well as the url you were visiting immediately before that (known as the “referrer” url).
-If you are creating a Custom Persona for your own use, Mozilla does not collect any Personal Information.
-The Personas gallery is where you can browse all the available designs. If you contribute a design or image (each a “Persona”) to the Personas gallery, Mozilla collects the following Personal Information: (1) your username and (2) your email address. Your username will be used to attribute your Persona to you and will be publicly available on the Personas gallery. You do not have to provide your real name; you can use a nickname or avatar. Mozilla will not make your email address publicly available without your consent or share it with any third parties other than Mozilla’s service providers. Mozilla will use your email address only to contact you regarding your design or to provide any additional information that you elect or opt in to receive.
-After you have selected your Persona, it is stored on your computer. Once per day the Personas service checks to see if your selected Persona has been updated. This feature sends the same information that web browsers typically transfer with any HTTP requests including user agent and your IP address.
-We use this information to improve our products and services and to support decision making regarding feature and capacity planning. Mozilla is an open organization that believes in sharing as much information as possible about its products, its operations, and its associations. Accordingly, we may release public reports containing Aggregate Data so that our global community and Personas partners may make better product and design decisions. For example, we think it is good for users of Personas to know which are the most popular Personas and Personas designers to know how many times their Persona was downloaded.
-Report Web Forgery Feature (not applicable to Firefox for mobile). Firefox’s Report Web Forgery feature lets you report suspected web forgeries to Mozilla’s third party service provider(s) for the web forgery protection feature when you encounter a suspected malicious “phishing” or fraudulent website that is impersonating a legitimate website. This feature sends your comments about the suspected fraudulent website to our third-party provider(s), as well as the same information that the browser sends when you visit a website. Our policy is to require each of our third-party providers to enter into written agreements with Mozilla that prohibit them from releasing Potentially Personal Information to the public. Our policy is to only permit these third party providers to use this information in conjunction with the web forgery protection service they are providing. In addition, we require each third-party provider to maintain its own privacy policy that is linked to the online form where you report a potential web forgery. To prevent the third party provider from obtaining this information, don’t use this feature to report a web forgery. (Also see “Protection Against Suspected Forgery and Attack Sites Features” below.)
- -Usage Statistics (also known as Telemetry). Beginning with version 7, Firefox includes functionality that sends Mozilla usage, performance, and responsiveness statistics about user interface features, memory, hardware configuration along with IP address.
- -- This feature is turned off by default in general release versions of Firefox and Firefox Beta. In order to enable Aurora and Nightly testers to provide more efficient feedback, Usage Statistics are enabled by default on Aurora and Nightly. In either case, if this functionality is enabled, users can disable it in Firefox's Options/Preferences by simply deselecting the "Submit performance data" item. -
- -- Usage statistics are transmitted using SSL (a method of protecting data in transit) and help us improve future versions of Firefox. Once sent to Mozilla, usage statistics are stored in an aggregate form and made available to a broad range of developers, including both Mozilla employees and public contributors. -
- -Snippets Firefox's default home page (<about:home>) loads small bits of information that we think will be useful to you. We call these "snippets". You can see them right below the search bar.
- -Once per day, Firefox gets new snippets from Mozilla. Whenever you see a snippet, that snippet makes a request to Mozilla, so that we can count how often snippets are viewed. This request to Mozilla sends the name of the snippet and is securely transmitted over HTTPS. Aside from this and standard log data collected as a part of any web request, snippets in Firefox do not send other information to Mozilla.
- -To help display relevant snippets, your Firefox browser sends Mozilla a monthly request to look up your location at a country level using your IP address. We then send that country level information back to your Firefox browser, where it's stored locally. Your Firefox browser (not our web servers) will then pick snippets to show you based on the locally stored country information.
- -Aside from providing you with the snippets service, we use the information from these requests to estimate what fraction of Firefox users click on each snippet (broken down into general categories like Firefox version and geographic area). We will not use any of the information in this request to attempt to identify you or your web browsing activity on other websites, and we aggregate the info we receive into these general categories as soon as is practical.
- -Feedback Button and Test Pilot for Beta Users. If you installed a Firefox 4 beta and then got the general release version of Firefox 4 by clicking an “update” button, then your Firefox still has the feedback features you received as a beta user. If you installed a beta version of Firefox 4 for computers and then got the general release version of Firefox 4 by clicking a “download” button, you still have the Test Pilot add-on as an extension to Firefox. The privacy policy for Feedback is here and for Test Pilot is here. If you decide to remove Test Pilot or Feedback from Firefox on your computer, you can do so under the Tools menu in Firefox by selecting add-ons in the drop down menu and then uninstall. If you decide to remove Beta Tester Tools from Firefox on your mobile device, you can do so under the Add-ons Manager pane in the Browser Controls window by selecting the add-on in the extension list and clicking "Disable."
- -Firefox Health Report. Firefox Health Report (“FHR”) is a Firefox feature designed to provide you with insights about your browser’s stability and performance. FHR does this by collecting data and sharing it with us in a way designed to minimize our ability to identify your browser. Our systems aggregate your data with that of other Firefox users and then send it back to your browser so you can see how your Firefox performance compares to others. FHR does not send us sites from your browsing history.
- -We use the data sent through FHR to provide users with FHR’s functionality, such as helping you analyze and address performance issues with your browser. We also use what we learn from the FHR data in the aggregate to make Firefox and our other products better. We may disclose aggregated FHR data openly in order to help further our mission of promoting openness, innovation and opportunity on the Web. We aim to be transparent about FHR and you can learn more about the exact data being sent to us in the feature itself. If you wish, you can choose not to share your FHR data with us in Firefox settings or the feature itself. Learn more about FHR.
- -Mozilla is committed to protecting your personal information from unauthorized access, alteration, disclosure, or destruction. We undertake a range of security measures including physical access restraints, technical security monitoring, and internal security reviews of the environment. We also have policies in place to prohibit employees from viewing personal information without business justification. Additionally, it is our policy to ensure that Mozilla employees and contractors are bound by confidentiality obligations.
- -Beginning with Firefox 2.0, Mozilla has additional security features, some of which are provided by third-party service providers.
- -The security features available depend on the version of Firefox you are using. Please see the end of this privacy policy for older versions of Firefox.
- -Secure Website Certificate Verification. When you visit a secure website, Firefox may check with any status provider mentioned in the certificate to validate that website’s certificate. Firefox sends only the certificate identification to the certificate provider, not the exact URL you are visiting. Sending these verification requests to third parties is sometimes necessary to ensure your connection to a site is secure; to help maintain your security, Firefox may block access to the site if it can't verify your connection using the third party. If the certificate is no longer valid, you will receive an error page that states why the certificate is not valid and you will not be able to access that website. The technical name for this process is OCSP or On-line Certificate Status Protocol. You may disable online certificate verification in Firefox's preferences under the encryption tab. If you do this, none of the information discussed here will be sent to any third party certificate provider. An article in our Firefox Knowledge Base gives you information about changing your preferences. However, if you choose to disable the online verification feature, Firefox will not be able to confirm the identity of the website you are visiting, which may put you at greater risk of having your private information intercepted. In this case, Firefox will also not show the identity of the website in the URL bar.
- - -Protection Against Suspected Forgery and Attack Sites Features (not applicable to Firefox for mobile). The Firefox forgery and attack protection feature displays a warning if the website you are visiting is suspected of impersonating a legitimate website (commonly referred to as a phishing or forgery website) or a site that infiltrates or damages a computer system without your informed consent, including, without limitation, any computer viruses, worms, trojan horses, spyware, computer contaminant and/or other malicious and unwanted software (commonly called an attack site or malware). By default, Firefox checks the web pages that you visit against a blacklist that is downloaded to your hard drive at regularly scheduled intervals (e.g., approximately twice per hour), the rate of frequency may change from time to time. The blacklist does not include the full URL of each suspicious site. Instead, each URL is hashed (obscured so it can't be read) and then broken into portions. Only a portion of each hashed URL is included on the blacklist on your hard drive. If there is a match, Firefox will check with its third party provider to ensure that the website is still on the blacklist. The information sent between Firefox and its third party provider(s) are hashed URLs. In fact, multiple hashed URLs are sent with the real hash so that the third party provider(s) will not know what site you are visiting. If there is a match, Firefox displays either a “Reported Web Forgery” or “Reported Attack Site” alert, as applicable.
- -You may completely turn off the forgery and/or attack site protection features in Firefox’s preferences. If you do this, none of the information discussed here will be downloaded to your hard drive or sent to any third party service provider. An article in our Firefox Knowledge Base gives you information about changing your preferences.
- -Each time Firefox checks in with a third party provider to download a new blacklist, Non-Personal Information and Potentially Personal Information, such as the information that the browser sends every time you visit a website as well as the version number of the blacklist on your system, is sent to a third party provider. In order to safeguard your privacy, Firefox will not transmit the complete URL of web pages that you visit to anyone other than Mozilla and its service providers. While it is possible that a third party service provider may determine the actual URL from the hashed URL sent, Mozilla’s policy is to require its third party service providers to enter into a written agreement with Mozilla not to use any data or other information about or from users of Firefox for purposes other than to provide and maintain their service. In addition, Mozilla’s policy is to prohibit these third party service providers from correlating any Firefox user data with any other data collected through other products, services or web properties of that provider. These third party service providers may post about additional notices regarding their applicable privacy policies. (For example, see Google Safe Browsing Service in Mozilla Firefox Version 3.)
- -Please note that we’re not yelling at you in this paragraph. Our lawyers have advised us that we need to make sure this information is conspicuous so you’ll read it. The forgery and attack site protection feature is provided “as is” and for your information as advice and guidance only. Mozilla and its contributors, licensors and partners do not guarantee that these protection features will prevent you from being deceived by a malicious website and we strongly recommend that you continue to be vigilant while online, particularly when following links sent to you in e-mail.
- -Consistent with our privacy commitments, we will scrutinize third party requests for information about you for compliance with the law, including those coming from governmental agencies or civil litigants. We may access, use, preserve or disclose information about you only when we have a good faith belief that it is reasonably necessary to do so to satisfy the applicable law, regulation, legal process or lawful governmental request of any country, or to protect the rights, property or safety of Mozilla, its users or the public. We will provide notice of legal process or governmental requests unless prohibited to do so by law or the circumstances warrant otherwise.
- - -Mozilla’s policy is to make Personal Information, such as your name and email address, and Potentially Personal Information, such as the URL of the site you last visited, only available to its employees, contractors, and selected contributors who signed confidentiality agreements that prohibit them from using or disclosing such information other than for approved Mozilla purposes.
- -We also work with third parties who provide infrastructure or back-end services (like content delivery networks, bandwidth providers, and services of an administrative nature). We may share Personal Information about you with such third parties for the purpose of enabling these third parties to provide such services.
- -Additionally, Mozilla may need to transfer Personal Information to an affiliate or successor in the event of a change of our corporate structure or status, such as in the event of a restructuring, sale, or bankruptcy.
- -Mozilla is a global organization and operates in different countries. Privacy laws and common practices vary from country to country. Some countries may provide for less legal protection of your personal data; others may provide more legal protection. By using Firefox, you consent to the transfer of the information collected, as outlined by this Policy, to Mozilla or its third party service providers in the United States, the Netherlands, and other places where our distributed, third party content delivery network exists (which is in several countries around the world), which countries may provide a lesser level of data security than in your country of residence.
- -We will retain any information collected for the period necessary to fulfill the purposes outlined in this Policy unless a longer retention period is required by law and/or regulations.
- -Mozilla may change the Firefox Privacy Policy from time to time. Any and all changes will be reflected on this page. Substantive changes may also be announced through the standard mechanisms by which Mozilla communicates with its users and community, such as Mozilla's "announce" mailing list and newsgroup. It is your responsibility to ensure that you understand the terms of this Privacy Policy. You should periodically check this page for any changes to the current policy.
- -You may request access, correction, or deletion of Personal Information or Potentially Personal Information, as permitted by law. We will seek to comply with such requests, provided that we have sufficient information to identify the Personal Information or Potentially Personal Information related to you.
- -Any such requests or other questions or concerns regarding this Policy and Mozilla's data protection practices should be addressed to:
- -
- Mozilla Corporation
- Attn: Legal Notices - Privacy
- 650 Castro Street, Suite 300
- Mountain View, CA 94041-2072
- Phone: +1-650-903-0800
- E-mail: privacy@mozilla.com
-
Firefox’s Report Broken Website feature lets you notify Mozilla when a website you visit improperly displays or incorrectly functions. The feature sends the URL of the broken website to Mozilla. You may also choose to send your email address and a description of the problem. This feature also sends your IP address and a variety of Non-Personal Information to Mozilla, including but not limited to the version of Firefox you are using and your language preference. Except for your email and IP address, Mozilla makes all of this information public. This feature does not send information to Mozilla until you explicitly authorize Firefox to do so. To prevent this public release of Personal and Potentially Personal Information, don’t report a website if the website’s URL contains your Personal and Potentially Personal Information, and don’t include Personal Information in your description of the problem. To prevent the release of any information, don’t use this feature to report a broken website.
-For these earlier versions of Firefox, “Talkback” is Firefox’s crash reporting feature. Talkback also gives you the option to provide your Personal Information and Potentially Personal Information (including your name, email address, and the url you were visiting) and Potentially Personal Information (including your computer’s name, IP address, and the processes you were running at the time of the crash). You can selectively disable the sending of this information. Additionally, you have the option to include the URL of the site you were visiting when Firefox crashed, a comment, and your email address in the report. Mozilla only makes Non-Personal Information and Potentially Personal Information in the public reports available online at http://talkback-public.mozilla.org/.
-Protection Against Suspected Forgery Sites. The Firefox web forgery protection feature displays a warning if the website you are visiting is suspected of impersonating a legitimate website. Firefox lets you select various levels of protection, and different information is transmitted by Firefox depending on the level you choose.
- -By default, Firefox checks the web pages that you visit against a list of suspected web forgeries (a “blacklist”) that is downloaded to your hard drive at regularly scheduled intervals (e.g., approximately twice per hour), the rate of frequency may change from time to time. If there is a match, Firefox displays a “Suspected Web Forgery” alert. Each time Firefox checks in with the third party provider to download a new blacklist, Non-Personal Information and Potentially Personal Information, such as the information that the browser sends every time you visit a website as well as the version number of the blacklist on your system, is sent to the third party provider. In order to safeguard your privacy, Firefox will not transmit the URL of web pages that you visit in this default mode to anyone other than Mozilla and its service providers.
- -You may completely turn off the web forgery protection feature in Firefox’s preferences. If you do this, none of the information discussed here will be downloaded to your hard drive or sent to any third party service provider.
- -Each time Firefox checks in with the third party provider to download a new blacklist, Non-Personal Information and Potentially Personal Information, such as the information that the browser sends every time you visit a website as well as the version number of the blacklist on your system, is sent to the third party provider. In order to safeguard your privacy, Firefox will not transmit the complete URL of web pages that you visit to anyone other than Mozilla and its service providers. While it is possible that a third party service provider may determine the actual URL from the hashed URL sent, Mozilla’s policy is to require its third party service providers to enter into a written agreement with Mozilla not to use any data or other information about or from users of Firefox for purposes other than to provide and maintain their service. In addition, Mozilla’s policy is to prohibit its third party service providers from correlating any Firefox user data with any other data collected through other products, services or web properties of that provider. These third party service providers may inform you about additional notices regarding their applicable privacy policies.
-Test content |
Find bar tests
-bottom
- - diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_findbar.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_findbar.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_findbar.js 2015-04-22 13:05:33.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_findbar.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,132 +0,0 @@ -/* vim: set ts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -function test() { - runTests(); -} - -gTests.push({ - desc: "Access the find bar with the keyboard", - run: function() { - let tab = yield addTab(chromeRoot + "browser_findbar.html"); - yield waitForCondition(() => BrowserUI.ready); - is(Elements.findbar.isShowing, false, "Find bar is hidden by default"); - - EventUtils.synthesizeKey("f", { accelKey: true }); - yield waitForEvent(Elements.findbar, "transitionend"); - is(Elements.findbar.isShowing, true, "Show find bar with Ctrl-F"); - - let textbox = document.getElementById("findbar-textbox"); - is(textbox.value, "", "Find bar is empty"); - - EventUtils.sendString("bar"); - is(textbox.value, "bar", "Type 'bar' into find bar"); - - EventUtils.synthesizeKey("f", { accelKey: true}); - yield waitForEvent(Elements.findbar, "transitionend"); - ok(document.commandDispatcher.focusedElement, textbox.inputField, "textbox field is focused with Ctrl-F"); - is(textbox.selectionStart, 0, "textbox field is selected with Ctrl-F."); - is(textbox.selectionEnd, textbox.value.length, "textbox field is selected with Ctrl-F."); - - EventUtils.synthesizeKey("VK_ESCAPE", { accelKey: true }); - yield waitForEvent(Elements.findbar, "transitionend"); - is(Elements.findbar.isShowing, false, "Hide find bar with Esc"); - - Browser.closeTab(tab); - } -}); - -gTests.push({ - desc: "Findbar/navbar interaction", - run: function() { - let tab = yield addTab(chromeRoot + "browser_findbar.html"); - yield waitForCondition(() => BrowserUI.ready); - is(ContextUI.navbarVisible, false, "Navbar is hidden by default"); - is(Elements.findbar.isShowing, false, "Find bar is hidden by default"); - - yield showNavBar(); - is(ContextUI.navbarVisible, true, "Navbar is visible"); - is(Elements.findbar.isShowing, false, "Find bar is still hidden"); - - EventUtils.synthesizeKey("f", { accelKey: true }); - yield Promise.all([waitForEvent(Elements.navbar, "transitionend"), - waitForEvent(Elements.findbar, "transitionend")]); - is(ContextUI.navbarVisible, false, "Navbar is hidden"); - is(Elements.findbar.isShowing, true, "Findbar is visible"); - - yield Promise.all([showNavBar(), - waitForEvent(Elements.findbar, "transitionend")]); - is(ContextUI.navbarVisible, true, "Navbar is visible again"); - is(Elements.findbar.isShowing, false, "Find bar is hidden again"); - - Browser.closeTab(tab); - } -}); - - -gTests.push({ - desc: "Show and hide the find bar with mouse", - run: function() { - let tab = yield addTab(chromeRoot + "browser_findbar.html"); - yield waitForCondition(() => BrowserUI.ready); - is(Elements.findbar.isShowing, false, "Find bar is hidden by default"); - - yield showNavBar(); - EventUtils.sendMouseEvent({ type: "click" }, "menu-button"); - EventUtils.sendMouseEvent({ type: "click" }, "context-findinpage"); - yield waitForEvent(Elements.findbar, "transitionend"); - is(Elements.findbar.isShowing, true, "Show find bar with menu item"); - - EventUtils.synthesizeMouse(document.getElementById("findbar-close-button"), 1, 1, {}); - yield waitForEvent(Elements.findbar, "transitionend"); - is(Elements.findbar.isShowing, false, "Hide find bar with close button"); - - Browser.closeTab(tab); - } -}); - -gTests.push({ - desc: "Text at bottom of screen is not obscured by findbar", - run: function() { - let textbox = document.getElementById("findbar-textbox"); - - let tab = yield addTab(chromeRoot + "browser_findbar.html"); - yield waitForCondition(() => BrowserUI.ready); - is(Elements.findbar.isShowing, false, "Find bar is hidden by default"); - - FindHelperUI.show(); - yield waitForCondition(() => FindHelperUI.isActive); - - EventUtils.sendString("bottom"); - let event = yield waitForEvent(window, "MozDeckOffsetChanged"); - ok(!(event instanceof Error), "MozDeckOffsetChanged received (1)"); - ok(event.detail > 0, "Browser deck shifted upward"); - - textbox.select(); - EventUtils.sendString("bar"); - event = yield waitForEvent(window, "MozDeckOffsetChanged"); - ok(!(event instanceof Error), "MozDeckOffsetChanged received (2)"); - is(event.detail, 0, "Browser deck shifted back to normal"); - - textbox.select(); - EventUtils.sendString("bottom"); - event = yield waitForEvent(window, "MozDeckOffsetChanged"); - ok(!(event instanceof Error), "MozDeckOffsetChanged received (3)"); - ok(event.detail > 0, "Browser deck shifted upward again"); - - let waitForDeckOffset = waitForEvent(window, "MozDeckOffsetChanged"); - let waitForTransitionEnd = waitForEvent(Elements.findbar, "transitionend"); - FindHelperUI.hide(); - event = yield waitForDeckOffset; - ok(!(event instanceof Error), "MozDeckOffsetChanged received (4)"); - is(event.detail, 0, "Browser deck shifted back to normal when findbar hides"); - - // Cleanup. - yield waitForTransitionEnd; - Browser.closeTab(tab); - } -}); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_flyouts.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_flyouts.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_flyouts.js 2015-04-22 13:05:33.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_flyouts.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -gTests.push({ - desc: "about flyout hides navbar, clears navbar selection, doesn't leak", - run: function() { - yield showNavBar(); - - let edit = document.getElementById("urlbar-edit"); - edit.value = "http://www.wikipedia.org/"; - - sendElementTap(window, edit); - - yield waitForCondition(function () { - return SelectionHelperUI.isSelectionUIVisible; - }); - ok(ContextUI.navbarVisible, "nav bar visible"); - - let promise = waitForEvent(FlyoutPanelsUI.AboutFlyoutPanel._topmostElement, "transitionend"); - FlyoutPanelsUI.show('AboutFlyoutPanel'); - yield promise; - - yield waitForCondition(function () { - return !SelectionHelperUI.isSelectionUIVisible; - }); - ok(!ContextUI.navbarVisible, "nav bar hidden"); - - promise = waitForEvent(FlyoutPanelsUI.AboutFlyoutPanel._topmostElement, "transitionend"); - FlyoutPanelsUI.hide('AboutFlyoutPanel'); - yield promise; - } -}); - -function test() { - if (!isLandscapeMode()) { - todo(false, "browser_selection_tests need landscape mode to run."); - return; - } - runTests(); -} diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.html thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.html --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.html 2015-04-22 13:05:33.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.js thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.js --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.js 2015-04-22 13:05:33.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_form_auto_complete.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ -// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -function clearFormHistory() { - FormHistory.update({ op : "remove" }); -} - -function test() { - runTests(); - clearFormHistory(); -} - -function setUp() { - clearFormHistory(); - PanelUI.hide(); - yield hideContextUI(); -} - -function tearDown() { - PanelUI.hide(); -} - -function checkAutofillMenuItemContents(aItemList) -{ - let errors = 0; - let found = 0; - for (let idx = 0; idx < AutofillMenuUI.commands.childNodes.length; idx++) { - let item = AutofillMenuUI.commands.childNodes[idx]; - let label = item.firstChild.getAttribute("value"); - let value = item.getAttribute("data"); - if (aItemList.indexOf(value) == -1) { - errors++; - info("unexpected entry:" + value); - } else { - found++; - } - } - is(errors, 0, "autofill menu item list error check"); - is(found, aItemList.length, "autofill item list length mismatch, some items were not found."); -} - -gTests.push({ - desc: "simple auto complete test to insure auto complete code doesn't break.", - setUp: setUp, - tearDown: tearDown, - run: function () { - let loadedPromise, shownPromise; - - yield addTab(chromeRoot + "browser_form_auto_complete.html"); - yield waitForCondition(function () { - return !Browser.selectedTab.isLoading(); - }); - - let tabDocument = Browser.selectedTab.browser.contentWindow.document; - let form = tabDocument.getElementById("form1"); - let input = tabDocument.getElementById("textedit1"); - - input.value = "hellothere"; - - loadedPromise = waitForObserver("satchel-storage-changed", null, "formhistory-add"); - form.submit(); - yield loadedPromise; - - // XXX Solves a problem with events not getting delivered to Content.js - // immediately after submitting the form. - yield waitForMs(500); - - tabDocument = Browser.selectedTab.browser.contentWindow.document; - input = tabDocument.getElementById("textedit1"); - ok(input, "input isn't null"); - input.focus(); - - // Desktop and metrofx display auto-completes in response to double mouse clicks. The - // first click is ignored. - shownPromise = waitForEvent(document, "popupshown"); - EventUtils.synthesizeMouseAtCenter(input, {}, Browser.selectedTab.browser.contentWindow); - EventUtils.synthesizeMouseAtCenter(input, {}, Browser.selectedTab.browser.contentWindow); - yield shownPromise; - - checkAutofillMenuItemContents(["hellothere", "one", "two", "three", "four", "five"]); - } -}); - -gTests.push({ - desc: "Test autocomplete selection with arrow key.", - setUp: setUp, - tearDown: tearDown, - run: function () { - - let newTab = yield addTab(chromeRoot + "browser_form_auto_complete.html"); - yield waitForCondition(function () { - return !Browser.selectedTab.isLoading(); - }); - - let tabDocument = newTab.browser.contentWindow.document; - let input = tabDocument.getElementById("textedit1"); - input.focus(); - - let shownPromise = waitForEvent(document, "popupshown"); - EventUtils.synthesizeKey("o", {}, window); - yield shownPromise; - - EventUtils.synthesizeKey("VK_DOWN", {}, window); - - yield waitForCondition(() => input.value == "one"); - - is(input.value, "one", "Input updated correctly"); - - EventUtils.synthesizeKey("VK_DOWN", {}, window); - - yield waitForCondition(() => input.value == "two"); - - is(input.value, "two", "Input updated correctly"); - - Browser.closeTab(newTab, { forceClose: true }); - } -}); diff -Nru thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_form_selects.html thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_form_selects.html --- thunderbird-trunk-40.0~a1~hg20150421r17821.240313/mozilla/browser/metro/base/tests/mochitest/browser_form_selects.html 2015-04-22 13:05:33.000000000 +0000 +++ thunderbird-trunk-40.0~a1~hg20150424r17837.240895/mozilla/browser/metro/base/tests/mochitest/browser_form_selects.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ - - -- -
- -