commit 90c35ef999de8b9ee09876f5772a2a728d2bafc1 Author: Arthur Edelstein arthuredelstein@gmail.com Date: Fri Jun 16 00:24:29 2017 -0700
Bug 21999: Fix display of language prompt for TBB/ESR52 --- src/chrome/content/torbutton.js | 116 ++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 64 deletions(-)
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js index 3999bd4..b14585b 100644 --- a/src/chrome/content/torbutton.js +++ b/src/chrome/content/torbutton.js @@ -12,7 +12,7 @@ let { Services } = Cu.import("resource://gre/modules/Services.jsm", {}); let { showDialog } = Cu.import("resource://torbutton/modules/utils.js", {}); let { unescapeTorString } = Cu.import("resource://torbutton/modules/utils.js", {}); let SecurityPrefs = Cu.import("resource://torbutton/modules/security-prefs.js", {}); -let { bindPrefAndInit } = Cu.import("resource://torbutton/modules/utils.js", {}); +let { bindPrefAndInit, observe } = Cu.import("resource://torbutton/modules/utils.js", {});
const k_tb_last_browser_version_pref = "extensions.torbutton.lastBrowserVersion"; const k_tb_browser_update_needed_pref = "extensions.torbutton.updateNeeded"; @@ -1997,6 +1997,8 @@ function torbutton_is_windowed(wind) { return true; }
+let stopLanguagePromptObserver; + // Bug 1506 P3: This is needed pretty much only for the version check // and the window resizing. See comments for individual functions for // details @@ -2031,11 +2033,12 @@ function torbutton_new_window(event) }
// If the default language is not English and we have not already asked, - // add a web progress listener that will show a "request English language - // web pages?" prompt the first time an http or https page is opened. + // add an http-on-modify-request observer that will show a "request English + // language web pages?" prompt the first time a content http or https page + // is opened. if (torbutton_should_prompt_for_language_preference()) { - progress.addProgressListener(torbutton_langPromptListener, - Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT); + stopLanguagePromptObserver = observe("http-on-modify-request", + torbutton_http_connection_observed); }
// Check the version on every new window. We're already pinging check in these cases. @@ -2210,68 +2213,53 @@ var torbutton_resizelistener = onSecurityChange: function() {} };
-var torbutton_langPromptListener = -{ - QueryInterface: function(aIID) - { - if (aIID.equals(Ci.nsIWebProgressListener) || - aIID.equals(Ci.nsISupportsWeakReference) || - aIID.equals(Ci.nsISupports)) - return this; - throw Cr.NS_NOINTERFACE; - }, - - onLocationChange: function(aProgress, aRequest, aURI) {}, +function torbutton_http_connection_observed(aRequest, aData) { + // If we are loading an HTTP page from content, show the + // "request English language web pages?" prompt. + try { + let httpChannel = aRequest.QueryInterface(Ci.nsIHttpChannel); + if (!aRequest.URI.schemeIs("http") && !aRequest.URI.schemeIs("https")) { + return; + } + if (!httpChannel) return; + let notificationCallbacks = httpChannel.notificationCallbacks; + if (!notificationCallbacks) return; + let loadContext = notificationCallbacks.getInterface(Ci.nsILoadContext); + if (!loadContext) return; + if (!loadContext.isContent) return; + // The above QI did not throw, the scheme is http[s], and we know the + // load context is content, so we must have a true HTTP request from content. + // Stop the observer and display the prompt if another window has + // not already done so. + stopLanguagePromptObserver();
- onStateChange: function(aProgress, aRequest, aFlag, aStatus) { - if (aFlag & Ci.nsIWebProgressListener.STATE_START) { - // If we are loading an HTTP page, show the - // "request English language web pages?" prompt. - try { - let httpChannel = aRequest.QueryInterface(Ci.nsIHttpChannel); - - // The above QI did not throw, so we must have an HTTP request. - // Remove this listener and display the prompt if another window has - // not already done so. - let progress = Cc["@mozilla.org/docloaderservice;1"] - .getService(Ci.nsIWebProgress); - progress.removeProgressListener(torbutton_langPromptListener, - Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT); - - if (torbutton_should_prompt_for_language_preference()) { - if (torbutton_is_homepage_url(aRequest.URI)) { - // If the homepage is being loaded, display the prompt after a - // delay to avoid a problem where a blank prompt is displayed. - // In this case, the homepage will be loaded using the current - // spoof English setting, which is OK. - setTimeout(function() { - if (torbutton_should_prompt_for_language_preference()) - torbutton_prompt_for_language_preference(); - }, 2000); - } else { - // No delay is needed. Display the prompt and fix up the - // Accept-Language header before allowing the load to continue. + if (torbutton_should_prompt_for_language_preference()) { + if (torbutton_is_homepage_url(aRequest.URI)) { + // If the homepage is being loaded, display the prompt after a + // delay to avoid a problem where a blank prompt is displayed. + // In this case, the homepage will be loaded using the current + // spoof English setting, which is OK. + setTimeout(function() { + if (torbutton_should_prompt_for_language_preference()) torbutton_prompt_for_language_preference(); - - // The Accept-Language header for this request was set when the - // channel was created. Reset it to match the value that will be - // used for future requests. - let val = torbutton_get_current_accept_language_value(aRequest.URI); - if (val) - httpChannel.setRequestHeader("Accept-Language", val, false); - } - } - } catch (e) {} + }, 2000); + } else { + // No delay is needed. Display the prompt and fix up the + // Accept-Language header before allowing the load to continue. + torbutton_prompt_for_language_preference(); + + // The Accept-Language header for this request was set when the + // channel was created. Reset it to match the value that will be + // used for future requests. + let val = torbutton_get_current_accept_language_value(aRequest.URI); + if (val) + httpChannel.setRequestHeader("Accept-Language", val, false); + } } - }, - - onProgressChange: function(aProgress, aRequest, curSelfProgress, - maxSelfProgress, curTotalProgress, - maxTotalProgress) {}, - onStatusChange: function(aProgress, aRequest, stat, message) {}, - onSecurityChange: function() {} -}; - + } catch (e) { + torbutton_log(3, e.message); + } +}
// aURI should be an http or https nsIURI object. function torbutton_get_current_accept_language_value(aURI)