зеркало из https://github.com/mozilla/pjs.git
Bug 499733 - Open Web Location dialog leaks URL/search entered in private browsing mode; r=mconnor
This commit is contained in:
Родитель
c27bd39a86
Коммит
29e9b3212e
|
@ -53,6 +53,10 @@ ifdef ENABLE_TESTS
|
|||
DIRS += content/test
|
||||
endif
|
||||
|
||||
EXTRA_JS_MODULES = \
|
||||
content/openLocationLastURL.jsm \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
PRE_RELEASE_SUFFIX := $(shell $(PYTHON) $(topsrcdir)/config/printprereleasesuffix.py \
|
||||
|
|
|
@ -49,6 +49,8 @@ try {
|
|||
// not critical, remain silent
|
||||
}
|
||||
|
||||
Components.utils.import("resource://gre/modules/openLocationLastURL.jsm");
|
||||
|
||||
function onLoad()
|
||||
{
|
||||
dialog.input = document.getElementById("dialog.input");
|
||||
|
@ -74,8 +76,7 @@ function onLoad()
|
|||
var element = dialog.openWhereList.getElementsByAttribute("value", value)[0];
|
||||
if (element)
|
||||
dialog.openWhereList.selectedItem = element;
|
||||
dialog.input.value = pref.getComplexValue("general.open_location.last_url",
|
||||
Components.interfaces.nsISupportsString).data;
|
||||
dialog.input.value = gOpenLocationLastURL.value;
|
||||
}
|
||||
catch(ex) {
|
||||
}
|
||||
|
@ -120,11 +121,7 @@ function open()
|
|||
}
|
||||
|
||||
if (pref) {
|
||||
var str = Components.classes["@mozilla.org/supports-string;1"]
|
||||
.createInstance(Components.interfaces.nsISupportsString);
|
||||
str.data = dialog.input.value;
|
||||
pref.setComplexValue("general.open_location.last_url",
|
||||
Components.interfaces.nsISupportsString, str);
|
||||
gOpenLocationLastURL.value = dialog.input.value;
|
||||
pref.setIntPref("general.open_location.last_window_choice", dialog.openWhereList.value);
|
||||
}
|
||||
|
||||
|
|
|
@ -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_import.js \
|
||||
browser_privatebrowsing_opendir.js \
|
||||
browser_privatebrowsing_openlocation.js \
|
||||
browser_privatebrowsing_pageinfo.js \
|
||||
browser_privatebrowsing_popupmode.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();
|
||||
}
|
Загрузка…
Ссылка в новой задаче