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