commit fd6f7de06ff2ae1beffb8d62bb75d7d16d1037c6 Author: Sukhbir Singh sukhbir@torproject.org Date: Mon Jul 13 09:16:41 2015 -0400
Update js-locale.mozpatch --- projects/instantbird/js-locale.mozpatch | 286 +++++++++++++++---------------- 1 file changed, 143 insertions(+), 143 deletions(-)
diff --git a/projects/instantbird/js-locale.mozpatch b/projects/instantbird/js-locale.mozpatch index b135523..bf45525 100644 --- a/projects/instantbird/js-locale.mozpatch +++ b/projects/instantbird/js-locale.mozpatch @@ -1,204 +1,204 @@ diff --git a/browser/base/content/test/general/mochitest.ini b/browser/base/content/test/general/mochitest.ini -index a129d73..139133e 100644 +index 139133e..a129d73 100644 --- a/browser/base/content/test/general/mochitest.ini +++ b/browser/base/content/test/general/mochitest.ini -@@ -28,7 +28,6 @@ support-files = +@@ -28,6 +28,7 @@ support-files =
[test_bug364677.html] [test_bug395533.html] --[test_bug_jsdefaultlocale.html] ++[test_bug_jsdefaultlocale.html] [test_contextmenu.html] skip-if = toolkit == "gtk2" || toolkit == "gtk3" || (os == 'mac' && os_version != '10.6') # disabled on Linux due to bug 513558, on Mac after 10.6 due to bug 792304 [test_contextmenu_input.html] diff --git a/browser/base/content/test/general/test_bug_jsdefaultlocale.html b/browser/base/content/test/general/test_bug_jsdefaultlocale.html -deleted file mode 100644 -index 6566ae0..0000000 ---- a/browser/base/content/test/general/test_bug_jsdefaultlocale.html -+++ /dev/null -@@ -1,41 +0,0 @@ --<!DOCTYPE HTML> --<html> --<!-- --https://bugs.torproject.org/13019 ----> --<head> -- <meta charset="utf-8"> -- <title>Test for Tor Bug #13019: Prevent fingerprinting of JS-exposed locale</title> -- <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> -- <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script> -- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> --</head> --<body> --<a target="_blank" href="https://bugs.torproject.org">Bug 13019</a> --<p id="display"></p> --<pre id="test"></pre> --<script type="application/javascript;version=1.8"> --let prefName = "javascript.use_us_english_locale", -- originalPrefValue = null, -- date = new Date(); --// Read the current pref value. --try { -- originalPrefValue = SpecialPowers.getBoolPref(prefName); --} catch (e) { } --// Enable pref "javascript.use_us_english_locale". --SpecialPowers.setBoolPref(prefName, true); --// Test that we are getting en-US locale everywhere it is exposed in JavaScript --is(Intl.Collator().resolvedOptions().locale, "en-US", "content JS locale from Intl.Collator"); --is(Intl.DateTimeFormat().resolvedOptions().locale, "en-US", "content JS locale Intl.DateTimeFormat"); --is(Intl.NumberFormat().resolvedOptions().locale, "en-US", "content JS locale from Intl.NumberFormat"); --is(date.toLocaleString(), date.toLocaleString("en-US"), "Date formatted by JS locale"); --// Return pref to its original value, if it had one. --if (originalPrefValue === null) { -- SpecialPowers.clearUserPref(prefName); --} else { -- SpecialPowers.setBoolPref(prefName, originalPrefValue); --} -- --</script> --</body> --</html> +new file mode 100644 +index 0000000..6566ae0 +--- /dev/null ++++ b/browser/base/content/test/general/test_bug_jsdefaultlocale.html +@@ -0,0 +1,41 @@ ++<!DOCTYPE HTML> ++<html> ++<!-- ++https://bugs.torproject.org/13019 ++--> ++<head> ++ <meta charset="utf-8"> ++ <title>Test for Tor Bug #13019: Prevent fingerprinting of JS-exposed locale</title> ++ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> ++ <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script> ++ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> ++</head> ++<body> ++<a target="_blank" href="https://bugs.torproject.org">Bug 13019</a> ++<p id="display"></p> ++<pre id="test"></pre> ++<script type="application/javascript;version=1.8"> ++let prefName = "javascript.use_us_english_locale", ++ originalPrefValue = null, ++ date = new Date(); ++// Read the current pref value. ++try { ++ originalPrefValue = SpecialPowers.getBoolPref(prefName); ++} catch (e) { } ++// Enable pref "javascript.use_us_english_locale". ++SpecialPowers.setBoolPref(prefName, true); ++// Test that we are getting en-US locale everywhere it is exposed in JavaScript ++is(Intl.Collator().resolvedOptions().locale, "en-US", "content JS locale from Intl.Collator"); ++is(Intl.DateTimeFormat().resolvedOptions().locale, "en-US", "content JS locale Intl.DateTimeFormat"); ++is(Intl.NumberFormat().resolvedOptions().locale, "en-US", "content JS locale from Intl.NumberFormat"); ++is(date.toLocaleString(), date.toLocaleString("en-US"), "Date formatted by JS locale"); ++// Return pref to its original value, if it had one. ++if (originalPrefValue === null) { ++ SpecialPowers.clearUserPref(prefName); ++} else { ++ SpecialPowers.setBoolPref(prefName, originalPrefValue); ++} ++ ++</script> ++</body> ++</html> diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp -index 877056e..169981e9 100644 +index 169981e9..877056e 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp -@@ -5217,13 +5217,6 @@ JS_SetDefaultLocale(JSRuntime* rt, const char* locale) +@@ -5217,6 +5217,13 @@ JS_SetDefaultLocale(JSRuntime* rt, const char* locale) return rt->setDefaultLocale(locale); }
--JS_PUBLIC_API(const char*) --JS_GetDefaultLocale(JSRuntime *rt) --{ -- AssertHeapIsIdle(rt); -- return rt->getDefaultLocale(); --} -- ++JS_PUBLIC_API(const char*) ++JS_GetDefaultLocale(JSRuntime *rt) ++{ ++ AssertHeapIsIdle(rt); ++ return rt->getDefaultLocale(); ++} ++ JS_PUBLIC_API(void) JS_ResetDefaultLocale(JSRuntime* rt) { diff --git a/js/src/jsapi.h b/js/src/jsapi.h -index 2a6fe34..2b279b5 100644 +index 2b279b5..2a6fe34 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h -@@ -4266,15 +4266,6 @@ extern JS_PUBLIC_API(bool) +@@ -4266,6 +4266,15 @@ extern JS_PUBLIC_API(bool) JS_SetDefaultLocale(JSRuntime* rt, const char* locale);
/* -- * Returns the default locale for the ECMAScript Internationalization API -- * (Intl.Collator, Intl.NumberFormat, Intl.DateTimeFormat). -- * Note that the Internationalization API encourages clients to -- * specify their own locales. -- */ --extern JS_PUBLIC_API(const char*) --JS_GetDefaultLocale(JSRuntime *rt); -- --/* ++ * Returns the default locale for the ECMAScript Internationalization API ++ * (Intl.Collator, Intl.NumberFormat, Intl.DateTimeFormat). ++ * Note that the Internationalization API encourages clients to ++ * specify their own locales. ++ */ ++extern JS_PUBLIC_API(const char*) ++JS_GetDefaultLocale(JSRuntime *rt); ++ ++/* * Reset the default locale to OS defaults. */ extern JS_PUBLIC_API(void) diff --git a/xpcom/build/XPCOMInit.cpp b/xpcom/build/XPCOMInit.cpp -index 292652d..a58d89c 100644 +index a58d89c..292652d 100644 --- a/xpcom/build/XPCOMInit.cpp +++ b/xpcom/build/XPCOMInit.cpp -@@ -8,7 +8,6 @@ +@@ -8,6 +8,7 @@
#include "mozilla/Atomics.h" #include "mozilla/Poison.h" --#include "mozilla/Preferences.h" ++#include "mozilla/Preferences.h" #include "mozilla/XPCOM.h" #include "nsXULAppAPI.h"
-@@ -44,8 +43,6 @@ +@@ -43,6 +44,8 @@ #include "nsSupportsPrimitives.h" #include "nsConsoleService.h"
--#include "nsIJSRuntimeService.h" -- ++#include "nsIJSRuntimeService.h" ++ #include "nsComponentManager.h" #include "nsCategoryManagerUtils.h" #include "nsIServiceManager.h" -@@ -488,67 +485,6 @@ NS_IMPL_ISUPPORTS(NesteggReporter, nsIMemoryReporter) +@@ -485,6 +488,67 @@ NS_IMPL_ISUPPORTS(NesteggReporter, nsIMemoryReporter) CountingAllocatorBase<NesteggReporter>::sAmount(0); #endif /* MOZ_WEBM */
--// Anonymous namespace for customizing the default locale that JavaScript --// uses, according to the value of the "javascript.use_us_english_locale" pref. --// The current default locale can be detected in JavaScript by calling --// `Intl.DateTimeFormat().resolvedOptions().locale` --namespace { -- --#define USE_US_ENGLISH_LOCALE_PREF "javascript.use_us_english_locale" -- --static char* sSystemLocale; --static char* sJSLocale; -- --// Returns a pointer to the current JS Runtime. --static --JSRuntime* GetRuntime() { -- nsresult rv; -- nsCOMPtr<nsIJSRuntimeService> rts = do_GetService("@mozilla.org/js/xpc/RuntimeService;1", &rv); -- if (NS_FAILED(rv)) return NULL; -- JSRuntime* rt; -- rts->GetRuntime(&rt); -- return rt; --} -- --// If the USE_US_ENGLISH_LOCALE_PREF is active, set all locales to US English. --// Otherwise, fall back to the default system and JS locales. --static --void UseUSEnglishLocalePrefChangedCallback(const char* /* pref */, void* /* closure */) { -- // Get a pointer to the default JS Runtime. -- JSRuntime* rt = GetRuntime(); -- if (rt) { -- // Read the pref to see if we will use US English locale. -- bool useUSEnglishLocale = mozilla::Preferences::GetBool(USE_US_ENGLISH_LOCALE_PREF, false); -- // Set the application-wide C-locale. Needed for Date.toLocaleFormat(). -- setlocale(LC_ALL, useUSEnglishLocale ? "C" : sSystemLocale); -- // Now override the JavaScript Runtime Locale that is used by the Intl API -- // as well as Date.toLocaleString, Number.toLocaleString, and String.localeCompare. -- JS_SetDefaultLocale(rt, useUSEnglishLocale ? "en-US" : sJSLocale); -- } --} -- --static --void StartWatchingUseUSEnglishLocalePref() { -- // Get the default system locale. To be used if US English locale pref is deactivated. -- sSystemLocale = strdup(setlocale(LC_ALL,NULL)); -- // Store the default JavaScript locale. -- JSRuntime* rt = GetRuntime(); -- if (rt) { -- sJSLocale = strdup(JS_GetDefaultLocale(rt)); -- } -- // Now keep the locale updated with the current pref value. -- mozilla::Preferences::RegisterCallbackAndCall(UseUSEnglishLocalePrefChangedCallback, USE_US_ENGLISH_LOCALE_PREF); --} -- --static --void StopWatchingUseUSEnglishLocalePref() { -- mozilla::Preferences::UnregisterCallback(UseUSEnglishLocalePrefChangedCallback, USE_US_ENGLISH_LOCALE_PREF); -- if (sSystemLocale) free(sSystemLocale); -- if (sJSLocale) JS_free(nullptr, sJSLocale); --} -- --} // anonymous namespace for locale hiding -- ++// Anonymous namespace for customizing the default locale that JavaScript ++// uses, according to the value of the "javascript.use_us_english_locale" pref. ++// The current default locale can be detected in JavaScript by calling ++// `Intl.DateTimeFormat().resolvedOptions().locale` ++namespace { ++ ++#define USE_US_ENGLISH_LOCALE_PREF "javascript.use_us_english_locale" ++ ++static char* sSystemLocale; ++static char* sJSLocale; ++ ++// Returns a pointer to the current JS Runtime. ++static ++JSRuntime* GetRuntime() { ++ nsresult rv; ++ nsCOMPtr<nsIJSRuntimeService> rts = do_GetService("@mozilla.org/js/xpc/RuntimeService;1", &rv); ++ if (NS_FAILED(rv)) return NULL; ++ JSRuntime* rt; ++ rts->GetRuntime(&rt); ++ return rt; ++} ++ ++// If the USE_US_ENGLISH_LOCALE_PREF is active, set all locales to US English. ++// Otherwise, fall back to the default system and JS locales. ++static ++void UseUSEnglishLocalePrefChangedCallback(const char* /* pref */, void* /* closure */) { ++ // Get a pointer to the default JS Runtime. ++ JSRuntime* rt = GetRuntime(); ++ if (rt) { ++ // Read the pref to see if we will use US English locale. ++ bool useUSEnglishLocale = mozilla::Preferences::GetBool(USE_US_ENGLISH_LOCALE_PREF, false); ++ // Set the application-wide C-locale. Needed for Date.toLocaleFormat(). ++ setlocale(LC_ALL, useUSEnglishLocale ? "C" : sSystemLocale); ++ // Now override the JavaScript Runtime Locale that is used by the Intl API ++ // as well as Date.toLocaleString, Number.toLocaleString, and String.localeCompare. ++ JS_SetDefaultLocale(rt, useUSEnglishLocale ? "en-US" : sJSLocale); ++ } ++} ++ ++static ++void StartWatchingUseUSEnglishLocalePref() { ++ // Get the default system locale. To be used if US English locale pref is deactivated. ++ sSystemLocale = strdup(setlocale(LC_ALL,NULL)); ++ // Store the default JavaScript locale. ++ JSRuntime* rt = GetRuntime(); ++ if (rt) { ++ sJSLocale = strdup(JS_GetDefaultLocale(rt)); ++ } ++ // Now keep the locale updated with the current pref value. ++ mozilla::Preferences::RegisterCallbackAndCall(UseUSEnglishLocalePrefChangedCallback, USE_US_ENGLISH_LOCALE_PREF); ++} ++ ++static ++void StopWatchingUseUSEnglishLocalePref() { ++ mozilla::Preferences::UnregisterCallback(UseUSEnglishLocalePrefChangedCallback, USE_US_ENGLISH_LOCALE_PREF); ++ if (sSystemLocale) free(sSystemLocale); ++ if (sJSLocale) JS_free(nullptr, sJSLocale); ++} ++ ++} // anonymous namespace for locale hiding ++ // Note that on OSX, aBinDirectory will point to .app/Contents/Resources/browser EXPORT_XPCOM_API(nsresult) NS_InitXPCOM2(nsIServiceManager** aResult, -@@ -830,8 +766,6 @@ NS_InitXPCOM2(nsIServiceManager** aResult, +@@ -766,6 +830,8 @@ NS_InitXPCOM2(nsIServiceManager** aResult, mozilla::eventtracer::Init(); #endif
-- // Start watching the "javascript.use_us_english_locale" pref. -- StartWatchingUseUSEnglishLocalePref(); ++ // Start watching the "javascript.use_us_english_locale" pref. ++ StartWatchingUseUSEnglishLocalePref(); return NS_OK; }
-@@ -1104,8 +1038,6 @@ ShutdownXPCOM(nsIServiceManager* aServMgr) +@@ -1038,6 +1104,8 @@ ShutdownXPCOM(nsIServiceManager* aServMgr) delete sExitManager; sExitManager = nullptr;
-- StopWatchingUseUSEnglishLocalePref(); -- ++ StopWatchingUseUSEnglishLocalePref(); ++ Omnijar::CleanUp();
HangMonitor::Shutdown();