forked from mirrors/gecko-dev
		
	Bug 499733 - Open Web Location dialog leaks URL/search entered in private browsing mode; r=mconnor
This commit is contained in:
		
							parent
							
								
									61a8e9a78c
								
							
						
					
					
						commit
						5b457ece1d
					
				
					 6 changed files with 297 additions and 7 deletions
				
			
		|  | @ -53,6 +53,10 @@ ifdef ENABLE_TESTS | ||||||
| DIRS += content/test | DIRS += content/test | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
|  | EXTRA_JS_MODULES = \
 | ||||||
|  | 	content/openLocationLastURL.jsm \
 | ||||||
|  | 	$(NULL) | ||||||
|  | 
 | ||||||
| include $(topsrcdir)/config/rules.mk | include $(topsrcdir)/config/rules.mk | ||||||
| 
 | 
 | ||||||
| PRE_RELEASE_SUFFIX := $(shell $(PYTHON) $(topsrcdir)/config/printprereleasesuffix.py \
 | PRE_RELEASE_SUFFIX := $(shell $(PYTHON) $(topsrcdir)/config/printprereleasesuffix.py \
 | ||||||
|  |  | ||||||
|  | @ -49,6 +49,8 @@ try { | ||||||
|   // not critical, remain silent
 |   // not critical, remain silent
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Components.utils.import("resource://gre/modules/openLocationLastURL.jsm"); | ||||||
|  | 
 | ||||||
| function onLoad() | function onLoad() | ||||||
| { | { | ||||||
|   dialog.input         = document.getElementById("dialog.input"); |   dialog.input         = document.getElementById("dialog.input"); | ||||||
|  | @ -74,8 +76,7 @@ function onLoad() | ||||||
|       var element = dialog.openWhereList.getElementsByAttribute("value", value)[0]; |       var element = dialog.openWhereList.getElementsByAttribute("value", value)[0]; | ||||||
|       if (element) |       if (element) | ||||||
|         dialog.openWhereList.selectedItem = element; |         dialog.openWhereList.selectedItem = element; | ||||||
|       dialog.input.value = pref.getComplexValue("general.open_location.last_url", |       dialog.input.value = gOpenLocationLastURL.value; | ||||||
|                                                 Components.interfaces.nsISupportsString).data; |  | ||||||
|     } |     } | ||||||
|     catch(ex) { |     catch(ex) { | ||||||
|     } |     } | ||||||
|  | @ -120,11 +121,7 @@ function open() | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (pref) { |   if (pref) { | ||||||
|     var str = Components.classes["@mozilla.org/supports-string;1"] |     gOpenLocationLastURL.value = dialog.input.value; | ||||||
|                         .createInstance(Components.interfaces.nsISupportsString); |  | ||||||
|     str.data = dialog.input.value; |  | ||||||
|     pref.setComplexValue("general.open_location.last_url", |  | ||||||
|                          Components.interfaces.nsISupportsString, str); |  | ||||||
|     pref.setIntPref("general.open_location.last_window_choice", dialog.openWhereList.value); |     pref.setIntPref("general.open_location.last_window_choice", dialog.openWhereList.value); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										94
									
								
								browser/base/content/openLocationLastURL.jsm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								browser/base/content/openLocationLastURL.jsm
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | ||||||
|  | /* ***** BEGIN LICENSE BLOCK ***** | ||||||
|  |  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||||
|  |  * | ||||||
|  |  * The contents of this file are subject to the Mozilla Public License Version | ||||||
|  |  * 1.1 (the "License"); you may not use this file except in compliance with | ||||||
|  |  * the License. You may obtain a copy of the License at | ||||||
|  |  * http://www.mozilla.org/MPL/
 | ||||||
|  |  * | ||||||
|  |  * Software distributed under the License is distributed on an "AS IS" basis, | ||||||
|  |  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||||
|  |  * for the specific language governing rights and limitations under the | ||||||
|  |  * License. | ||||||
|  |  * | ||||||
|  |  * The Original Code is Open Location Dialog Utility Code. | ||||||
|  |  * | ||||||
|  |  * The Initial Developer of the Original Code is | ||||||
|  |  * Ehsan Akhgari <ehsan.akhgari@gmail.com>. | ||||||
|  |  * Portions created by the Initial Developer are Copyright (C) 2009 | ||||||
|  |  * the Initial Developer. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Contributor(s): | ||||||
|  |  * | ||||||
|  |  * Alternatively, the contents of this file may be used under the terms of | ||||||
|  |  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||||
|  |  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||||
|  |  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||||
|  |  * of those above. If you wish to allow use of your version of this file only | ||||||
|  |  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||||
|  |  * use your version of this file under the terms of the MPL, indicate your | ||||||
|  |  * decision by deleting the provisions above and replace them with the notice | ||||||
|  |  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||||
|  |  * the provisions above, a recipient may use your version of this file under | ||||||
|  |  * the terms of any one of the MPL, the GPL or the LGPL. | ||||||
|  |  * | ||||||
|  |  * ***** END LICENSE BLOCK ***** */ | ||||||
|  | 
 | ||||||
|  | const LAST_URL_PREF = "general.open_location.last_url"; | ||||||
|  | const nsISupportsString = Components.interfaces.nsISupportsString; | ||||||
|  | 
 | ||||||
|  | var EXPORTED_SYMBOLS = [ "gOpenLocationLastURL" ]; | ||||||
|  | 
 | ||||||
|  | let pbSvc = Components.classes["@mozilla.org/privatebrowsing;1"] | ||||||
|  |                       .getService(Components.interfaces.nsIPrivateBrowsingService); | ||||||
|  | let prefSvc = Components.classes["@mozilla.org/preferences-service;1"] | ||||||
|  |                         .getService(Components.interfaces.nsIPrefBranch); | ||||||
|  | 
 | ||||||
|  | let observer = { | ||||||
|  |   QueryInterface: function (aIID) { | ||||||
|  |     if (aIID.equals(Components.interfaces.nsIObserver) || | ||||||
|  |         aIID.equals(Components.interfaces.nsISupports) || | ||||||
|  |         aIID.equals(Components.interfaces.nsISupportsWeakReference)) | ||||||
|  |       return this; | ||||||
|  |     throw Components.results.NS_NOINTERFACE; | ||||||
|  |   }, | ||||||
|  |   observe: function (aSubject, aTopic, aData) { | ||||||
|  |     gOpenLocationLastURLData = ""; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | Components.classes["@mozilla.org/observer-service;1"] | ||||||
|  |           .getService(Components.interfaces.nsIObserverService) | ||||||
|  |           .addObserver(observer, "private-browsing", true); | ||||||
|  | 
 | ||||||
|  | let gOpenLocationLastURLData = ""; | ||||||
|  | let gOpenLocationLastURL = { | ||||||
|  |   get value() { | ||||||
|  |     if (pbSvc.privateBrowsingEnabled) | ||||||
|  |       return gOpenLocationLastURLData; | ||||||
|  |     else { | ||||||
|  |       try { | ||||||
|  |         return prefSvc.getComplexValue(LAST_URL_PREF, nsISupportsString).data; | ||||||
|  |       } | ||||||
|  |       catch (e) { | ||||||
|  |         return ""; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   set value(val) { | ||||||
|  |     if (typeof val != "string") | ||||||
|  |       val = ""; | ||||||
|  |     if (pbSvc.privateBrowsingEnabled) | ||||||
|  |       gOpenLocationLastURLData = val; | ||||||
|  |     else { | ||||||
|  |       let str = Components.classes["@mozilla.org/supports-string;1"] | ||||||
|  |                           .createInstance(Components.interfaces.nsISupportsString); | ||||||
|  |       str.data = val; | ||||||
|  |       prefSvc.setComplexValue(LAST_URL_PREF, nsISupportsString, str); | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   reset: function() { | ||||||
|  |     prefSvc.clearUserPref(LAST_URL_PREF); | ||||||
|  |     gOpenLocationLastURLData = ""; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  | @ -55,6 +55,7 @@ _BROWSER_TEST_FILES =  \ | ||||||
| 		browser_privatebrowsing_geoprompt_page.html \
 | 		browser_privatebrowsing_geoprompt_page.html \
 | ||||||
| 		browser_privatebrowsing_import.js \
 | 		browser_privatebrowsing_import.js \
 | ||||||
| 		browser_privatebrowsing_opendir.js \
 | 		browser_privatebrowsing_opendir.js \
 | ||||||
|  | 		browser_privatebrowsing_openlocation.js \
 | ||||||
| 		browser_privatebrowsing_pageinfo.js \
 | 		browser_privatebrowsing_pageinfo.js \
 | ||||||
| 		browser_privatebrowsing_popupmode.js \
 | 		browser_privatebrowsing_popupmode.js \
 | ||||||
| 		browser_privatebrowsing_searchbar.js \
 | 		browser_privatebrowsing_searchbar.js \
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,110 @@ | ||||||
|  | /* ***** BEGIN LICENSE BLOCK ***** | ||||||
|  |  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||||
|  |  * | ||||||
|  |  * The contents of this file are subject to the Mozilla Public License Version | ||||||
|  |  * 1.1 (the "License"); you may not use this file except in compliance with | ||||||
|  |  * the License. You may obtain a copy of the License at | ||||||
|  |  * http://www.mozilla.org/MPL/
 | ||||||
|  |  * | ||||||
|  |  * Software distributed under the License is distributed on an "AS IS" basis, | ||||||
|  |  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||||
|  |  * for the specific language governing rights and limitations under the | ||||||
|  |  * License. | ||||||
|  |  * | ||||||
|  |  * The Original Code is Private Browsing Tests. | ||||||
|  |  * | ||||||
|  |  * The Initial Developer of the Original Code is | ||||||
|  |  * Ehsan Akhgari. | ||||||
|  |  * Portions created by the Initial Developer are Copyright (C) 2009 | ||||||
|  |  * the Initial Developer. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Contributor(s): | ||||||
|  |  *   Ehsan Akhgari <ehsan.akhgari@gmail.com> (Original Author) | ||||||
|  |  * | ||||||
|  |  * Alternatively, the contents of this file may be used under the terms of | ||||||
|  |  * either of the GNU General Public License Version 2 or later (the "GPL"), | ||||||
|  |  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||||
|  |  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||||
|  |  * of those above. If you wish to allow use of your version of this file only | ||||||
|  |  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||||
|  |  * use your version of this file under the terms of the MPL, indicate your | ||||||
|  |  * decision by deleting the provisions above and replace them with the notice | ||||||
|  |  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||||
|  |  * the provisions above, a recipient may use your version of this file under | ||||||
|  |  * the terms of any one of the MPL, the GPL or the LGPL. | ||||||
|  |  * | ||||||
|  |  * ***** END LICENSE BLOCK ***** */ | ||||||
|  | 
 | ||||||
|  | // This test makes sure that Open Location dialog is usable inside the private browsing
 | ||||||
|  | // mode without leaving any trace of the URLs visited.
 | ||||||
|  | 
 | ||||||
|  | function test() { | ||||||
|  |   // initialization
 | ||||||
|  |   let pb = Cc["@mozilla.org/privatebrowsing;1"]. | ||||||
|  |            getService(Ci.nsIPrivateBrowsingService); | ||||||
|  |   let ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]. | ||||||
|  |            getService(Ci.nsIWindowWatcher); | ||||||
|  |   waitForExplicitFinish(); | ||||||
|  | 
 | ||||||
|  |   function openLocation(url, autofilled, callback) { | ||||||
|  |     let observer = { | ||||||
|  |       observe: function(aSubject, aTopic, aData) { | ||||||
|  |         switch (aTopic) { | ||||||
|  |         case "domwindowopened": | ||||||
|  |           let dialog = aSubject.QueryInterface(Ci.nsIDOMWindow); | ||||||
|  |           dialog.addEventListener("load", function () { | ||||||
|  |             dialog.removeEventListener("load", arguments.callee, false); | ||||||
|  | 
 | ||||||
|  |             let browser = gBrowser.getBrowserForTab(gBrowser.selectedTab); | ||||||
|  |             browser.addEventListener("load", function() { | ||||||
|  |               browser.removeEventListener("load", arguments.callee, true); | ||||||
|  | 
 | ||||||
|  |               is(browser.currentURI.spec, url, | ||||||
|  |                  "The correct URL should be loaded via the open location dialog"); | ||||||
|  |               executeSoon(callback); | ||||||
|  |             }, true); | ||||||
|  | 
 | ||||||
|  |             executeSoon(function() { | ||||||
|  |               let input = dialog.document.getElementById("dialog.input"); | ||||||
|  |               is(input.value, autofilled, "The input field should be correctly auto-filled"); | ||||||
|  |               input.focus(); | ||||||
|  |               for (let i = 0; i < url.length; ++i) | ||||||
|  |                 EventUtils.synthesizeKey(url[i], {}, dialog); | ||||||
|  |               EventUtils.synthesizeKey("VK_RETURN", {}, dialog); | ||||||
|  |             }); | ||||||
|  |           }, false); | ||||||
|  |           break; | ||||||
|  | 
 | ||||||
|  |         case "domwindowclosed": | ||||||
|  |           ww.unregisterNotification(this); | ||||||
|  |           break; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     ww.registerNotification(observer); | ||||||
|  |     gPrefService.setIntPref("general.open_location.last_window_choice", 0); | ||||||
|  |     openDialog("chrome://browser/content/openLocation.xul", "_blank", | ||||||
|  |                "chrome,titlebar", window); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   gPrefService.clearUserPref("general.open_location.last_url"); | ||||||
|  | 
 | ||||||
|  |   openLocation("http://example.com/", "", function() { | ||||||
|  |     openLocation("http://example.org/", "http://example.com/", function() { | ||||||
|  |       // enter private browsing mode
 | ||||||
|  |       pb.privateBrowsingEnabled = true; | ||||||
|  |       openLocation("about:logo", "", function() { | ||||||
|  |         openLocation("about:buildconfig", "about:logo", function() { | ||||||
|  |           // exit private browsing mode
 | ||||||
|  |           pb.privateBrowsingEnabled = false; | ||||||
|  |           openLocation("about:blank", "http://example.org/", function() { | ||||||
|  |             gPrefService.clearUserPref("general.open_location.last_url"); | ||||||
|  |             gPrefService.clearUserPref("general.open_location.last_window_choice"); | ||||||
|  |             finish(); | ||||||
|  |           }); | ||||||
|  |         }); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,84 @@ | ||||||
|  | /* ***** BEGIN LICENSE BLOCK ***** | ||||||
|  |  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | ||||||
|  |  * | ||||||
|  |  * The contents of this file are subject to the Mozilla Public License Version | ||||||
|  |  * 1.1 (the "License"); you may not use this file except in compliance with | ||||||
|  |  * the License. You may obtain a copy of the License at | ||||||
|  |  * http://www.mozilla.org/MPL/
 | ||||||
|  |  * | ||||||
|  |  * Software distributed under the License is distributed on an "AS IS" basis, | ||||||
|  |  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | ||||||
|  |  * for the specific language governing rights and limitations under the | ||||||
|  |  * License. | ||||||
|  |  * | ||||||
|  |  * The Original Code is Private Browsing Test Code. | ||||||
|  |  * | ||||||
|  |  * The Initial Developer of the Original Code is | ||||||
|  |  * Ehsan Akhgari <ehsan.akhgari@gmail.com>. | ||||||
|  |  * Portions created by the Initial Developer are Copyright (C) 2009 | ||||||
|  |  * the Initial Developer. All Rights Reserved. | ||||||
|  |  * | ||||||
|  |  * Contributor(s): | ||||||
|  |  * | ||||||
|  |  * Alternatively, the contents of this file may be used under the terms of | ||||||
|  |  * either the GNU General Public License Version 2 or later (the "GPL"), or | ||||||
|  |  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), | ||||||
|  |  * in which case the provisions of the GPL or the LGPL are applicable instead | ||||||
|  |  * of those above. If you wish to allow use of your version of this file only | ||||||
|  |  * under the terms of either the GPL or the LGPL, and not to allow others to | ||||||
|  |  * use your version of this file under the terms of the MPL, indicate your | ||||||
|  |  * decision by deleting the provisions above and replace them with the notice | ||||||
|  |  * and other provisions required by the GPL or the LGPL. If you do not delete | ||||||
|  |  * the provisions above, a recipient may use your version of this file under | ||||||
|  |  * the terms of any one of the MPL, the GPL or the LGPL. | ||||||
|  |  * | ||||||
|  |  * ***** END LICENSE BLOCK ***** */ | ||||||
|  | 
 | ||||||
|  | // Test the correct behavior of the openLocationLastURL.jsm JS module.
 | ||||||
|  | 
 | ||||||
|  | function run_test_on_service() | ||||||
|  | { | ||||||
|  |   let Cc = Components.classes; | ||||||
|  |   let Ci = Components.interfaces; | ||||||
|  |   let Cu = Components.utils; | ||||||
|  |   Cu.import("resource://gre/modules/openLocationLastURL.jsm"); | ||||||
|  | 
 | ||||||
|  |   let pb = Cc[PRIVATEBROWSING_CONTRACT_ID]. | ||||||
|  |            getService(Ci.nsIPrivateBrowsingService); | ||||||
|  |   let pref = Cc["@mozilla.org/preferences-service;1"]. | ||||||
|  |              getService(Ci.nsIPrefBranch); | ||||||
|  |   gOpenLocationLastURL.reset(); | ||||||
|  | 
 | ||||||
|  |   do_check_eq(typeof gOpenLocationLastURL, "object"); | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, ""); | ||||||
|  | 
 | ||||||
|  |   const url1 = "mozilla.org"; | ||||||
|  |   const url2 = "mozilla.com"; | ||||||
|  | 
 | ||||||
|  |   gOpenLocationLastURL.value = url1; | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, url1); | ||||||
|  | 
 | ||||||
|  |   gOpenLocationLastURL.value = ""; | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, ""); | ||||||
|  | 
 | ||||||
|  |   gOpenLocationLastURL.value = url2; | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, url2); | ||||||
|  | 
 | ||||||
|  |   pb.privateBrowsingEnabled = true; | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, ""); | ||||||
|  | 
 | ||||||
|  |   pb.privateBrowsingEnabled = false; | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, url2); | ||||||
|  |   pb.privateBrowsingEnabled = true; | ||||||
|  | 
 | ||||||
|  |   gOpenLocationLastURL.value = url1; | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, url1); | ||||||
|  | 
 | ||||||
|  |   pb.privateBrowsingEnabled = false; | ||||||
|  |   do_check_eq(gOpenLocationLastURL.value, url2); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Support running tests on both the service itself and its wrapper
 | ||||||
|  | function run_test() { | ||||||
|  |   run_test_on_all_services(); | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue
	
	 Ehsan Akhgari
						Ehsan Akhgari