From 848ef0e31fa2e91bf8d15384647e2a3602dad62d Mon Sep 17 00:00:00 2001 From: Michael Kraft Date: Fri, 19 Jun 2009 09:37:08 +0200 Subject: [PATCH] Bug 491168 - Allow SessionStore to save/restore referrer field. r=zeniko --- .../sessionstore/src/nsSessionStore.js | 5 ++ .../sessionstore/test/browser/Makefile.in | 1 + .../test/browser/browser_491168.js | 82 +++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 browser/components/sessionstore/test/browser/browser_491168.js diff --git a/browser/components/sessionstore/src/nsSessionStore.js b/browser/components/sessionstore/src/nsSessionStore.js index ef5a08ec7a9..46c1f82f152 100644 --- a/browser/components/sessionstore/src/nsSessionStore.js +++ b/browser/components/sessionstore/src/nsSessionStore.js @@ -1182,6 +1182,9 @@ SessionStoreService.prototype = { } entry.ID = aEntry.ID; + if (aEntry.referrerURI) + entry.referrer = aEntry.referrerURI.spec; + if (aEntry.contentType) entry.contentType = aEntry.contentType; @@ -2046,6 +2049,8 @@ SessionStoreService.prototype = { shEntry.loadType = Ci.nsIDocShellLoadInfo.loadHistory; if (aEntry.contentType) shEntry.contentType = aEntry.contentType; + if (aEntry.referrer) + shEntry.referrerURI = ioService.newURI(aEntry.referrer, null, null); if (aEntry.cacheKey) { var cacheKey = Cc["@mozilla.org/supports-PRUint32;1"]. diff --git a/browser/components/sessionstore/test/browser/Makefile.in b/browser/components/sessionstore/test/browser/Makefile.in index 58ddc7d8d7d..17ebbd882d6 100644 --- a/browser/components/sessionstore/test/browser/Makefile.in +++ b/browser/components/sessionstore/test/browser/Makefile.in @@ -87,6 +87,7 @@ _BROWSER_TEST_FILES = \ browser_485482_sample.html \ browser_485563.js \ browser_490040.js \ + browser_491168.js \ browser_493467.js \ $(NULL) diff --git a/browser/components/sessionstore/test/browser/browser_491168.js b/browser/components/sessionstore/test/browser/browser_491168.js new file mode 100644 index 00000000000..09b7820290c --- /dev/null +++ b/browser/components/sessionstore/test/browser/browser_491168.js @@ -0,0 +1,82 @@ +/* ***** 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 sessionstore test code. + * + * The Initial Developer of the Original Code is + * Michael Kraft . + * 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 ***** */ + +function test() { + /** Test for Bug 491168 **/ + + // test setup + let ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore); + let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); + + waitForExplicitFinish(); + + const REFERRER1 = "http://www.example.net/?" + Date.now(); + const REFERRER2 = "http://www.example.net/?" + Math.random(); + + let tab = gBrowser.addTab(); + gBrowser.selectedTab = tab; + + let browser = tab.linkedBrowser; + browser.addEventListener("load", function() { + browser.removeEventListener("load", arguments.callee, true); + + let tabState = JSON.parse(ss.getTabState(tab)); + is(tabState.entries[0].referrer, REFERRER1, + "Referrer retrieved via getTabState matches referrer set via loadURI."); + + tabState.entries[0].referrer = REFERRER2; + ss.setTabState(tab, JSON.stringify(tabState)); + + tab.addEventListener("SSTabRestored", function() { + tab.removeEventListener("SSTabRestored", arguments.callee, false); + is(window.content.document.referrer, REFERRER2, "document.referrer matches referrer set via setTabState."); + + gBrowser.removeTab(tab); + let newTab = ss.undoCloseTab(window, 0); + newTab.addEventListener("SSTabRestored", function() { + newTab.removeEventListener("SSTabRestored", arguments.callee, false); + + is(window.content.document.referrer, REFERRER2, "document.referrer is still correct after closing and reopening the tab."); + gBrowser.removeTab(newTab); + + finish(); + }, true); + }, true); + },true); + + let referrerURI = ioService.newURI(REFERRER1, null, null); + browser.loadURI("http://www.example.net", referrerURI, null); +}